gpt4 book ai didi

Haskell:了解 Monad 的绑定(bind)运算符 (>>=)

转载 作者:行者123 更新时间:2023-12-02 09:07:02 25 4
gpt4 key购买 nike

我有以下功能:

parse :: String -> Maybe Token

我正在尝试实现以下功能:
maketokenlist :: String -> Maybe [Token]

如果存在无法解析的标记,则该函数返回 Nothing(即,如果标记不是整数或算术运算符,则 parse 返回 Nothing),否则返回 Token 列表。

由于 Maybe 是 Monad 类型类的一个实例,我有以下方法:
maketokenlist str =  return (words str) >>= parse

我将字符串转换为单个标记的列表(例如 "2 3 +"变为 ["2","3","+"] ,然后将解析函数映射到列表中的每个字符串。

由于列表的 Monad 实例定义为:
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
fail _ = []

但是,假设我有字符串列表 [2, 3, "+", "a"] 并且在使用 >>= 对每个元素进行映射解析后,我得到 [Just 2, Just 3, Just (+), Nothing] ,因为“a”无法解析。有没有办法只使用 >>= 运算符使函数 maketokenlist 返回 Nothing?任何见解都值得赞赏。

最佳答案

如果 parse :: String -> Maybe Token , 然后:

traverse parse :: [String] -> Maybe [Token]

这个版本的 traverse (我专门将列表作为 Traversable 实例和 Maybe 作为 Applicative 实例)确实可以使用 (>>=) 来实现:
listMaybeTraverse parse [] = pure []
listMaybeTraverse parse (s:ss) =
parse s >>= \token ->
listMaybeTraverse parse ss >>= \tokens ->
pure (token:tokens)

我选择了 parse 的名称, s , 和 token显示与您计划使用的对应关系,但当然它适用于任何适当类型的函数,而不仅仅是 parse .
Monad 的实例for 列表不会出现在此代码中。

关于Haskell:了解 Monad 的绑定(bind)运算符 (>>=),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57046755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com