Haskell中为何我的谓词被解析为布尔值?
Haskell中find函数谓词写法的问题分析与解决
你碰到的这个坑其实是Haskell里函数应用优先级搞的鬼!
你原本想写的是一个“接收元组,返回x是否等于元组首元素”的谓词,但x == fst会被Haskell解析成(==) x fst——也就是把fst当成了一个普通变量(值)来和x做相等比较,而不是把==和x绑定后,再去接收fst处理后的结果。毕竟Haskell里函数应用的优先级比所有运算符都高,编译器不会自动帮你把fst当成函数去和前面的表达式组合。
给你几个正确的写法,比列表推导更贴合find函数的用法:
最直观的lambda表达式写法:
find (\t -> x == fst t) list这里
\t -> ...明确定义了一个接收元组t的函数,先对t取首元素,再和x比较,完全符合你的需求。用函数组合(
.)的简洁写法:find ((== x) . fst) list(== x)是一个柯里化后的函数(接收一个值,判断它是否等于x),.把它和fst组合起来,意思就是“先取元组的首元素,再判断这个元素是否等于x”,非常简洁。
另外你提到用列表推导解决了问题,比如类似head [t | t <- list, fst t == x]这样的写法,但要注意如果列表里没有符合条件的元组,head会报错,而find会返回Maybe类型(找不到就返回Nothing),安全性更高哦。
内容的提问来源于stack exchange,提问作者fabikaktus
相关产品推荐
相关产品推荐

