繁体   English   中英

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

[英]Haskell: Understanding the bind operator (>>=) for Monads

我有以下功能:

parse :: String -> Maybe Token

我正在尝试实现以下功能:

maketokenlist :: String -> Maybe [Token]

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

由于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函数不返回任何内容? 任何见解都表示赞赏。

如果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)

我选择了名称parsestoken来显示与您计划的用法的对应关系,但是它当然适用于任何适当类型的函数,而不仅仅是parse

用于列表的Monad实例不在此代码中出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM