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