2017-04-15 4 views
2

に2つの複素数を追加すると、私はこのようなHaskellの中に2つの複素数の追加製:ハスケル

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)。読者のモナドでは、 'ap ::(e-> a-> b) - >(e-> a) - >(e-> b)'という2つのサブ関数に1つの引数を渡すことができます。つまり、 'f fx x'は' f x(g x) 'であり、' f'と 'g'の両方に' x 'を渡します。したがって、与えられた議論が方程式のRHS上で複写されると、 '?pl'はしばしば' ap'を記述する項で答えるでしょう。 –

+0

助けてくれてありがとう、私はちょうど興味があった。 – JoeDonald