簡體   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