2014-03-12 67 views
4

不能提出更好的主題標題,不幸的是......對不起。帶有兩個參數的綁定操作符(= <<)

我有一個函數,它需要兩個純參數並返回一個monadic值。 而且我有兩個monadic值可以輸入它。 這可能是我錯過的一些愚蠢的東西。 我通常會使用(= < <),如果它只是一個參數,但現在我堅持兩個。

所以我需要一個函數與這種類型的簽名

(a1 -> a2 -> m b) -> m a1 -> m a2 -> m b 

Hoogle的不給我任何東西。 我知道我可以使用「做」符號,但我想知道如果這可以做到沒有? 是否有可能與綁定運營商是這樣的咖喱:

(function =<< value1) =<< value2 

我想「liftM2」可能是有用的,但它需要一個返回純值的函數。

謝謝。

回答

7

一種可能的解決方案是結合使用join :: Monad m => m (m a) -> m aliftM2用:

join $ liftM2 function value1 value2 
+0

這正是我想的,想試試......讓我看看。 –

+0

是的,它的工作原理。我也錯過了上面提到的類似問題。謝謝。 –

1

沒有一個這樣的功能,但它是微不足道的定義之一。

bind2 f m n = do 
    m' <- m 
    n' <- n 
    f m' n' 
+0

非常感謝。但我想避免'do'notation。我沒有創建一個額外的函數,而是將所有的東西都包裝在一個符號中。所以它有點失敗了。 –

+0

@ r.sendecky並不完全,'bind2 f'比我上面發佈的短很多,Haskell很好地構建了像這樣的組合器,想'mapM','liftM','liftM2','sequence', 'sequence_','forM' ... – jozefg