我想了解以下內容在完成點免費電話:Haskell函數組合 - (a - > b) - >(a - > c) - >(b - > c - > d) - >(a - > d)
withinBounds :: [Int] -> Bool
withinBounds xs = (all (>= 0) xs) && (all (<= 8) xs)
我明白,這是優於它這種方式可讀性/理智的緣故寫的,但我想更多地瞭解我如何可以撰寫功能。我一直在撓我的腦袋,以至於我該如何做到這一點。 全體(擴大?)型簽名
[Int] -> ([Int] -> Bool) -> ([Int] -> Bool) -> (Bool -> Bool -> Bool) -> Bool
我試圖讓該組合物的類型簽名是
(a -> b) -> (a -> c) -> (b -> c -> d) -> (a -> d)
我寫了下面作爲一個私生子 - 拉姆達形式筆記。如果有一種方法在一定程度上簡化與演算的問題,這將會是巨大的,如果可能太解釋說:
\[email protected][] -> \[email protected]([] -> Bool) -> \[email protected]([] -> Bool) -> \[email protected](Bool -> Bool -> Bool) -> f3.(f1.L).(f2.L)
在上面,.
是應用程序,@
被捕獲(使F3是另一種(Bool - > Bool - > Bool)的名稱)。 非常感謝。
編輯:我知道這不是最優化或可重用的代碼,我知道將其轉換爲無點代碼會使其在可讀性等方面變得更糟。爲了澄清,我在問如何將其轉化爲點 - 免費,因爲我想了解更多關於haskell和作文。
EDIT2:A really good SO answer on point-free
你'withinBounds'不是組合的,最好是寫一個單一元素的檢查,然後調用'all'上。實際上,我可能只需將inBounds內的'all withinBounds'內聯到一個單獨的元素中。 –
謝謝。是否有一個功能不可組合的跡象? (例如在身體的多個位置需要輸入?) – MIJOTHY
@MIJOTHY:通常,如果類型更一般,它可能更易於重用,例如, 'withinBounds :: Ord e =>(e,e) - > e - > Bool; withinBounds(a,b)x = a <= x && x <= b'。現在你的原始函數只是'all(withinBounds(0,8))'。此外,我可以用它作爲過濾器的謂詞:'filter(withinBounds(4,100))[1..103]'。 – Zeta