在寫一個簡單的RPN計算器的過程中,我有以下類型別名:摺疊flatMap /綁定過的函數列表(又名名Combinator的!)
type Stack = List[Double]
type Operation = Stack => Option[Stack]
...我已經寫的Scala代碼好奇的前瞻性線:
val newStack = operations.foldLeft(Option(stack)) { _ flatMap _ }
這需要值的初始stack
和適用的operations
列表到該堆棧。每個操作可能會失敗(即產生一個Option[Stack]
),所以我將它們排序爲flatMap
。對於這個(在我看來)有點不尋常的事情是,我摺疊了一列monadic函數,而不是摺疊數據列表。
我想知道是否有一個標準函數捕獲這種「摺疊綁定」行爲。當我試圖打「名稱Combinator的」遊戲,Hoogle通常是我的朋友,所以我試圖在Haskell同樣的腦力鍛鍊:
foldl (>>=) (Just stack) operations
的此類型有:
foldl :: (a -> b -> a) -> a -> [b] -> a
(>>=) :: Monad m => m a -> (a -> m b) -> m b
所以,我的神祕foldl (>>=)
結合器的類型,使得各類foldl
和(>>=)
排隊後,應該是:
mysteryCombinator :: Monad m => m a -> [a -> m a] -> m a
...這又是什麼,我們會期望。我的問題是,搜索Hoogle的功能與該類型沒有結果。我嘗試了一些我認爲可能是合理的排列:a -> [a -> m a] -> m a
(即以非一元值開始),[a -> m a] -> m a -> m a
(即參數翻轉),但在那裏也沒有運氣。所以我的問題是,有沒有人知道我的神祕「摺疊綁定」組合的標準名稱?
我建議不要使用組合器的這種實現;我相信'(>> =)'的大部分實現都是以右關聯的方式使用的,所以這很可能會導致性能問題(比如左對齊的'(++)'堆棧一樣)。 – ehird 2012-01-03 18:12:29
@ehird - 我不認爲我理解......你還會怎麼建議按照從左到右的順序應用一系列'[a - > ma]'操作到某個開始的'a'或'ma '價值?另外,請記住我並不是在問一個語言特定的問題; Scala和Haskell之間的性能特徵會有所不同(你可以假設我使用'foldl'來實現嚴格性)。我真正關心的是這件事是否有一個衆所周知的名字。 – mergeconflict 2012-01-03 18:29:53
我認爲@ehird的觀點是'foldr'可以更有效率,因爲它可以提前停止(例如,如果是'Nothing')。 – 2012-01-03 18:35:28