我在Haskell中添加了两个复数,如下所示:
data Complex = C
{ realC :: Double
, imgC :: Double
} deriving Show
addC :: Complex -> Complex -> Complex
addC (C a b) (C c d)= C (a+c) (b+d)
我的问题是:我可以让上述函数(addC(无点吗?
是的:
addC = ap (ap . (C .) . (. realC) . (+) . realC) ((. imgC) . (+) . imgC)
显然我不建议这样做。你可以通过要求lambdabot在 #haskell IRC频道中无点化的东西来学习,或者自己从Hackage下载和使用它。这是我为获取上述定义而运行的命令:
?pl addC l r = C (realC l + realC r) (imgC l + imgC r)
但是,当手动操作时,通常可以做出更具可读性的结果。例如:
addC = liftA2 (liftA2 C) ((+) `on` realC) ((+) `on` imgC)
即使有了这个有点可破译的版本,我仍然非常喜欢你写的代码;你的代码很简单,它的作用非常明显,这种风格使得很难弄错代码。