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

如何从Haskell自定义Board类型中查找指定Position对应值

你遇到的报错核心原因有两个:

  1. Board a 是通过 Grid 构造器封装了内部存储的键值对列表的自定义类型,不能直接把Board类型的变量传入需要列表参数的search函数,需要先通过模式匹配把内部的列表取出来。
  2. 你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:45:07