在哈斯克尔中将两个复数相加

  • 本文关键字:两个 哈斯克 haskell
  • 更新时间 :
  • 英文 :


我在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)

即使有了这个有点可破译的版本,我仍然非常喜欢你写的代码;你的代码很简单,它的作用非常明显,这种风格使得很难弄错代码。

最新更新