2015-10-19 64 views
11

我已經享受了最近學習一點伊德里斯的奢侈,而且我發現一件非常方便的事情就是! - 註釋,讓我縮短內部的monadic代碼不要阻止如伊斯利斯的哈斯克爾版本 - 註釋(bang notation)

a' <- a 
b' <- b 
c' <- c 
someFunction a' b' c' 

到好得多

someFunction !a !b !c 

現在,當我寫在Haskell代碼,我在尋找類似的,但據我可以告訴它不存在的東西(而且爆炸字符顯然已經用於嚴格的模式匹配)。有沒有什麼辦法可以避免在do塊中有一堆瑣碎的左箭頭?也許是一個增加了重寫規則的擴展,或者這個效果呢?

回答

20

因爲每個單子是Applicative(與GHC> = 7.10),我們可以寫

someFunction <$> a <*> b <*> c 

注意,如果someFunction返回m T類型的單子值,上面會返回m (m T),這可能不是什麼我們希望(@pigworker在下面指出)。我們可以然而join兩層在一起:(與join如果需要的話)

join $ someFunction <$> a <*> b <*> c 
+1

完美的答案,正是我所需要的。我想我需要花更多時間在Applicative上。謝謝。 – Karl

+2

'someFunction'的類型是什麼?它的返回類型是否是monadic? – pigworker

+0

@pigworker好點,我確實忽略了這種情況。 – chi

2

說到箭......

import Control.Arrow 

a' = Kleisli $ const a 
b' = Kleisli $ const b 
c' = Kleisli $ const c 

foo = (`runKleisli`()) $ 
    (a' &&& b') &&& c' >>> uncurry (uncurry someFunction) 

不是我推薦這個。

+4

Ew,ew,ew。什麼? – dfeuer