【问题标题】:Adding two complex numbers in Haskell在 Haskell 中添加两个复数
【发布时间】:2017-04-15 10:11:31
【问题描述】:

我在 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)无点吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    是的:

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

    显然我不建议这样做。您可以通过让 lambdabot 在#haskell IRC 频道中对内容进行无点化来学习这一点,或者自己下载并使用它from Hackage。这是我运行以获得上述定义的命令:

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

    但是,当手动执行时,通常可以得到更具可读性的结果。例如:

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

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

    【讨论】:

    • 感谢您的回答。你能告诉我什么是“ap”吗?
    • @JoeDonald 您可以使用Hoogle 找到the documentation for ap。使用 reader monad,ap :: (e -> a -> b) -> (e -> a) -> (e -> b),它允许您将单个参数传递给两个子函数。也就是说,ap f g xf x (g x),它将x 传递给fg。因此,当给定的参数在等式的 RHS 上重复时,?pl 通常会回复提及ap 的术语。
    • 感谢您的帮助,我只是好奇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2019-10-15
    • 1970-01-01
    • 2017-01-22
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多