2017-10-04 83 views
1

剛剛被介紹給哈斯克爾的單子,並與>>碰到了一些障礙。正確使用>>在Haskell

>>=對我來說很有意義,因爲我可以得到下面的出前奏曲:

Prelude> Just 1 >>= (\ x -> Just (x+1)) 
Just 2 

我的理解是,>>是一樣的綁定,但僅用於當函數是關於恆定的參數。但是,當我嘗試這樣做,在前奏:

Prelude> Just 1 >> (\_ -> Just 10) 

<interactive>:7:12: error: 
• Couldn't match expected type ‘Maybe b’ 
       with actual type ‘t0 -> Maybe Integer’ 
• The lambda expression ‘\ _ -> Just 10’ has one argument, 
    but its type ‘Maybe b’ has none 
    In the second argument of ‘(>>)’, namely ‘(\ _ -> Just 10)’ 
    In the expression: Just 1 >> (\ _ -> Just 10) 
• Relevant bindings include 
    it :: Maybe b (bound at <interactive>:7:1) 

我非常努力破譯此錯誤消息...誰能與>>正確使用幫助?我對此不瞭解的是什麼?

+0

好,因爲''>>因素已經指出,'\ _ - >'你不必給它明確寫入。 –

回答

2

(>>=)有型號Monad m => m a -> (a -> m b) -> m b。在你的例子中mMaybe所以你提供了一個Maybe Int和一個函數Int -> Maybe Int

(>>)的類型爲Monad m => m a -> m b -> m b所以您需要通過Maybe b而不是返回Maybe b例如Maybe b的函數。

Just 1 >> Just 10 

在這種情況下,這是一樣的Just 10但如果第一個值是Nothing的結果也將是Nothing

Nothing >> Just 10 

你通常會使用(>>)如果第一個值代表了你一定的效果想要執行並忽略結果,例如IO

putStrLn "Hello world" >> pure 10 :: IO Int 

State

put "state" >> pure 10 :: State String Int 
+0

啊謝謝你!對不起,如果這本身需要一個完整的問題,但是這到底是什麼呢? 「Just 1」只是10'的目的是什麼,只是「Just 10」沒有? –

+0

@TheHelpfulBees - 查看更新。 – Lee

+0

@TheHelpfulBees,'也許'可能不是考慮'>>'的最好例子。你可能會更多地考慮它爲'State'','Writer w'或'IO'做什麼。一旦你理解了這個模式,你就能夠看到它以一種相當無趣的方式應用於''a'',它的無聊表姐'Maybe',甚至更瑣碎的'Reader e'和'Identity'。 – dfeuer

相關問題