2017-07-09 15 views
0

高次関数についてちょっと混乱しています。私がよく理解しているかどうかを知るために愚かな例をやりたかったのですが、まだエラーなしでコンパイルできない、つまり何かが欠けていると思います。私の非常に基本的な例は次のとおりです.2つの数値を加算した関数を作成し、前の関数を使用して他の数値を合計する関数を作成します。Haskell高次関数

Sum2 :: Double -> Double -> Double 
Sum2 a b = a + b 

Sum3 :: (Double -> Double -> Double) -> Double -> Double  
Sum3 a b c = (Sum2 a b) + c 


test1:: Double 
test1 = Sum3 2.0 3.0 4.0 
+2

ここでの質問は何ですか? –

+0

あなたの例は、別の関数を呼び出す関数です。これは高次ではなく、関数を引数として取るか、関数から関数を返す必要があります。 – melpomene

+0

さて、私は混乱しているかもしれませんが、私はsum3の引数でsum2を呼び出すことによって高次を行っていると思いました。それはハスケルで私の最初の日であり、私はいくつかのコンセプトをミックスしてクリアしています。ご回答有難うございます。 – Babas

答えて

1

そこには疑問はありませんが、私はOPはこれが機能しない理由についていくつか説明したいと思います:

Sum3 :: (Double -> Double -> Double) -> Double -> Double  
Sum3 a b c = (Sum2 a b) + c 

まず、関数は小文字の名前を持つ必要があります。第二に、上記のタイプの2つの引数を持つ関数のタイプです:

sum3 :: (Double -> Double -> Double) -> Double -> Double  
     ----- first arg ------------ -2nd-- -result type- 

ので、一つは

sum3 f a = ... 
fは、最初の引数として渡された Double -> Double -> Double関数であり、 aが第二である

を書く必要があります議論番号。 fは2つの引数をとる関数なので、適切に使用する必要があります。

sum3 f a = f a a 
-- or 
sum3 f a = f a 12 
-- or 
sum3 f a = f (a+12) (f 32 a) 

私はあなたが達成しようとしていることについては考えていませんが、上記は単なる例です。

最後に、sum3という名前は直感的ではありません。他のものを使用する必要があります。

+0

Chiさん、ありがとう、私は宣言と関数を呼び出す方法について混乱しているかもしれませんが、あなたは私を助けました。良い一日を :) – Babas