haskell - 为什么我不能在 'isJust' 的 lambda 函数中使用 `foldr` ?

标签 haskell fold type-mismatch

我目前正在用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

所以yBool 类型但你正在考虑它的类型 Maybe a .
因此,foldr (\x y -> (isJust x) && y) True maybeList是正确的解决方案。

关于haskell - 为什么我不能在 'isJust' 的 lambda 函数中使用 `foldr` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67935376/

相关文章:

function - foldl类型中 `t a -> b`的含义

java - Android kotlin Object Any 类型不匹配

list - 最左边-最里面和最外面(Haskell)

parsing - attoparsec 错误解析 double

haskell - 树折叠操作?

haskell - 原始递归和变态之间有什么联系?

arrays - 将函数拆分为数组。类型不匹配错误#13

VB6 数组和类型不匹配

haskell - 树的最小高度

haskell - 在 ghci 中获取 IO Monad 的结果