我目前正在用haskell 为原始编程语言编写解释器。
我试图在解释之前查看当前正在分析的程序是否正确键入。基本上我最终得到的是一个名为 maybeList
的列表。如果它们是正确的,则保存初始化变量的映射,或 Nothing
s 如果他们不这样做,像这样:[Maybe [(k,v)]]
我正在尝试使用此功能折叠此列表foldr (\x y -> (isJust x) && (isJust y)) True maybeList
根据我对 Haskell 和 foldr
的了解功能,这应该工作。但是,它给了我错误:
Couldn't match expected type ‘Bool’ with actual type ‘Maybe a0’ In the expression: foldr (\ x y -> (isJust x) && (isJust y)) True maybeList
我要问的是为什么编译器不知道
isJust
函数返回一个 bool 值,它一直将其视为 Maybe a0
类型?附言我理解一个简单的
elem Nothing maybeList
将代替这个。但我想了解为什么这不起作用
最佳答案
foldr
的归约函数将与初始元素类型相同的东西作为第二个参数:
foldr (\x y -> (isJust x) && (isJust y)) True maybeList
-- \_______________________________/
-- |
-- these two must be the same type
所以y
是 Bool
类型但你正在考虑它的类型 Maybe a
.因此,
foldr (\x y -> (isJust x) && y) True maybeList
是正确的解决方案。
关于haskell - 为什么我不能在 'isJust' 的 lambda 函数中使用 `foldr` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67935376/