2017-04-15 73 views
2

复数我做了两个复数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)点免费的吗?

回答

3

烨:

addC = ap (ap . (C .) . (. realC) . (+) . realC) ((. imgC) . (+) . imgC) 

很显然,我不建议这样做。你可以通过在#haskell IRC频道询问lambdabot来免费获得这些信息,或者自己下载并使用from Hackage来学习。这是我跑得到上述定义的命令:

?pl addC l r = C (realC l + realC r) (imgC l + imgC r) 

然而,做手工的时候,它往往可能使更可读的结果。例如:

addC = liftA2 (liftA2 C) ((+) `on` realC) ((+) `on` imgC) 

即使有了这个有点可破译的版本,我仍然强烈倾向于您编写的代码;你的代码很简单,它的功能非常明显,而且这种风格很难让代码错误。

+0

谢谢你的回答。你能告诉我什么是“ap”? – JoeDonald

+0

@JoeDonald您可以使用[Hoogle](http://haskell.org/hoogle)查找[ap'的文档](https://hackage.haskell.org/package/base-4.9.1.0/docs /Control-Monad.html#v:ap)。使用reader monad,可以将单个参数传递给两个子函数,即:ap ::(e - > a - > b) - >(e - > a) - >(e - > b)也就是说,'f f g x'是'f x(g x)',它将'x'传递给'f'和'g'。所以当一个给定的参数与方程的RHS重复时,“?pl”通常会回答一个提到“ap”的术语。 –

+0

感谢您的帮助,我只是好奇。 – JoeDonald