作爲第一步,我們觀察到您的定義
outputList x y = concat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
可以使用函數組合物操作者(.)
而不是函數應用操作者的($)
如下改寫。
outputList x y = (concat . map ($ y) . map ($ x)) [getRow,getColumn,getBlock]
接下來我們注意到,map
是另一名fmap
在列表和滿足fmap
法律,因此,特別是,我們有map (f . g) == map f . map g
。我們應用此法來定義使用單個應用程序map
的版本。
outputList x y = (concat . map (($ y) . ($ x))) [getRow,getColumn,getBlock]
作爲最後一步,我們可以通過concatMap
取代的concat
和map
組合物。
outputList x y = concatMap (($ y) . ($ x)) [getRow,getColumn,getBlock]
最後,在我看來,雖然哈斯克爾程序員往往使用很多花哨的運營商,它不是一種恥辱定義函數通過
outputList x y = concatMap (\f -> f x y) [getRow,getColumn,getBlock]
,因爲它明確表示,該函數做什麼。然而,使用類型抽象(如其他答案中所示)可能是一件好事,因爲您可能會發現您的問題具有特定的抽象結構並獲得新的見解。
順便說一下,有沒有任何靜態需要多長時間,直到有關Haskell的問題得到回答?我的印象是,所有哈斯克爾問題中有90%幾乎立即得到解答。雖然這並沒有說明答案的質量,但我認爲它們的質量也相當高。 –
@JanChristiansen:如果你願意,你可以使用堆棧交換數據瀏覽器來回答。我做了一個非常粗略的近似(過濾器明顯異常,忽略自我答案,&c。),典型的(即中位數)時間大約是20分鐘,直到第一個答案發布。 –