如何从Haskell自定义Board类型中查找指定Position对应值
你遇到的报错核心原因有两个:
Board a是通过Grid构造器封装了内部存储的键值对列表的自定义类型,不能直接把Board类型的变量传入需要列表参数的search函数,需要先通过模式匹配把内部的列表取出来。- 你的
Board内部存储的列表类型是[(Position, Maybe a)],所以search执行后返回的是Maybe (Maybe a),需要把两层Maybe合并为一层才符合你声明的label函数返回类型。
方案1:基于你已写的search函数实现
无需额外导入其他库的写法:
label :: Position -> Board a -> Maybe a label p (Grid gridList) = case search p gridList of -- 匹配到位置且位置有值,返回包裹值的Just Just (Just val) -> Just val -- 位置不存在 / 位置存在但无值,都返回Nothing _ -> Nothing
如果可以导入基础库,写法可以更精简:
import Control.Monad (join) label :: Position -> Board a -> Maybe a label p (Grid gridList) = join $ search p gridList
join函数会自动把两层Maybe压平,逻辑和上面的case写法完全一致。
方案2:更简便的原生实现
你自己写的search函数其实就是Haskell标准库Data.List中自带的lookup函数,完全可以直接复用,不用自己维护查找逻辑:
import Control.Monad (join) import Data.List (lookup) label :: Position -> Board a -> Maybe a label p (Grid gridList) = join $ lookup p gridList
内容的提问来源于stack exchange,提问作者Jaffa
相关产品推荐
相关产品推荐

