You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何相同定义下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:17:35