2016-08-29 10 views
2

私は、この関数の型プロファイルを定義する必要があります。この関数の型プロファイルを定義する方法は?

twice f x = f (f x); 

結果は以下でなければなりませんが、私は本当に、なぜ得ることはありません。

('a -> 'a) -> 'a -> 'a 
+0

を行いますあなたは、高次関数、または数学のGoFを使用しています。タイプ:タイプを表示するにはtを押します。本を参照 - Haskellを学ぶ – RicardoVallejo

+0

何も入力せずに、自分で定義する必要があります。 – mlhack

+0

私はHaskellの "ステートメント"の最後にセミコロンを使用している最近のいくつかの質問を見てきました。必要なものではなく、典型的なハスケルではないので、あなたが選んだ本/学習リソースは何ですか? – ErikR

答えて

3

(a -> a) -> a -> aが正しい答えです。なぜそれを見つけるために断片に分割してみましょう。言って、これらの引数の最初の

  • a -> c -> dは単項関数である - - 署名は三つの部分がありますので、

    1. あなたの関数は、二つの引数、fxを取るa = (a -> b)を作る(aは、任意の種類のことを覚えておいてください、限り、それは署名に一度だけ表示されます)と署名がtwice(a -> b) -> c -> d
    2. 結果のように見えるように、その最初の引数の結果と同じである - d = bと署名を行い(a -> b) -> c -> b
    3. f引数としてtwiceの第2引数を取る - これはc = aなり、署名は次のようになり:(a -> b) -> a -> b
    4. twicea = bことを意味し、それ自身の出力に適用されている - これは、最終的な署名(a -> a) -> a -> a
  • +0

    明確なexplantionのおかげで、私はそれを理解した! :) – mlhack

    関連する問題