6
我想寫一個功能點,免費在Haskell,讓事情變得簡單可以說,我想使這個功能:點操作功能
maxmin :: Ord a => a -> a -> a -> a
maxmin a b c = max a (min b c)
我可以改善這
maxmin a b = (max a) . (min b)
但有什麼辦法擺脫a和b?
我想寫一個功能點,免費在Haskell,讓事情變得簡單可以說,我想使這個功能:點操作功能
maxmin :: Ord a => a -> a -> a -> a
maxmin a b c = max a (min b c)
我可以改善這
maxmin a b = (max a) . (min b)
但有什麼辦法擺脫a和b?
我不會說這是simplier但在這裏你去:
maxmin :: Ord a => a -> a -> a -> a
maxmin = (. min) . (.) . max
(從lambdabot
http://www.haskell.org/haskellwiki/Pointfree生成具有pl
工具)
lambdabot> pl maxmin a b c = max a (min b c)
maxmin = (. min) . (.) . max
你只需要使用"three laws of sections"爲,
(a `op` b) = (a `op`) b = (`op` b) a = op a b
這樣
import Control.Arrow
maxmin a b = (max a) . (min b)
= (.) (max a) (min b)
= uncurry (.) (max a, min b)
= uncurry (.) . (max *** min) $ (a, b)
= curry (uncurry (.) . (max *** min)) a b
它也不太可讀。 :)
無點是一種代碼*風格*,因此應該只在提高可讀性時才使用;無點記法編譯不同的情況(因爲內聯)不是您通常需要擔心的事情(在分析後想一想)。在你的情況下,我會說無點沒有幫助;例如,將'maxmin'重命名爲'constrainTo'將會是一個更具表現力的變化。 – David