[英]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)
我選擇了名稱parse
, s
和token
來顯示與您計划的用法的對應關系,但是它當然適用於任何適當類型的函數,而不僅僅是parse
。
用於列表的Monad
實例不在此代碼中出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.