为何相同定义下foldl正常运行而foldl'报错?
问题分析与解决
错误核心原因
你导入的foldl'来自Data.ByteString模块,这个函数是专门为ByteString(字节串,元素固定为Word8)设计的专用折叠函数,而非通用列表的严格左折叠函数。而你的maximum''函数声明为处理任意Ord类型的列表[a],两者类型不匹配,编译器因此将列表元素x错误推断为Word8,与你定义的类型变量a冲突,从而抛出类型错误。
解决方法
将foldl'的导入来源改为处理通用列表的Data.List模块(GHC 8.0及以后版本的Prelude默认包含foldl',也可直接去掉错误导入):
修正后的代码
-- 正确导入列表的foldl' import Data.List (foldl') maximum' :: Ord a => [a] -> Maybe a maximum' = foldl (\ acc x -> max acc (Just x)) Nothing maximum'' :: Ord a => [a] -> Maybe a maximum'' = foldl' (\ acc x -> max acc (Just x)) Nothing
补充说明
foldl'确实是foldl的高效严格版本,但不同模块提供的foldl'是针对不同数据结构的实现:
Data.List.foldl':处理通用列表[a]Data.ByteString.foldl':处理ByteString(元素为Word8)- 其他如
Data.Text.foldl'则处理文本类型
使用时需根据操作的数据结构选择对应模块的折叠函数。
内容的提问来源于stack exchange,提问作者mali
相关产品推荐
相关产品推荐

