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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:58:04