0

次のシグネチャを使用してサンプル関数を実装する必要があります。

[[([Char],  a,  b)]] -> (a  ->  b  ->  Char)  ->  ([Char],  b  ->  a  ->  Char)

だから私はこのように試みます:

funcD [[([' '],x,y)]] uFunc0D = ([' '],  uFunc1D)
    where
        uFunc0D x y = ' '   
        uFunc1D y x  = ' '

しかし、私がそれのタイプを呼び出すと

:t funcD

戻ります

funcD :: [[([Char], t1, t2)]] -> t -> ([Char], t3 -> t4 -> Char)

いくつかの質問:

  1. tではなく、2 番目の引数に対して返されるのはなぜ(a -> b -> Char)ですか?
  2. Charに渡し' 'ましたが、動作しますが、のように空の char-arg を渡したいのです''が、動作しません。
  3. 結果の署名で t1 と t2 ではなく t3 と t4 を取得するのはなぜですか?

前もって感謝します

編集:私の次の試み:

funcD1 [[([' '],x,y)]] (uFunc0D x y = ' ' where _ = x y) = ([' '],  uFunc1D)
    where
        uFunc1D y x  = ' '
4

1 に答える 1

4
  1. uFunc0Dwhereは使用されません (同じ名前の関数で句の引数をシャドウします)
  2. ' 'は文字リテラルを示し、1 文字を含む必要があります。文字列のことを考えているかもしれませんが、その場合""は空の文字列です。
  3. への引数は、入力引数および とuFunc1Dはまったく関係がないため、自由に異なる型にすることができます。xy

編集:

戻り値の型に影響を与えるには、式 (等号の右側) で引数を使用する必要があります。句での宣言により、andがwhere導入されます。の宣言は、関数の引数 (左側) のバインディングを隠します。そのため、たとえrhs で言及したとしても、引数ではなく、where 句で宣言したものになります。uFunc0DuFunc1DuFunc0DuFunc0DuFunc0D

編集2:

関数が必要だとします。f :: (a -> b) -> a -> Char

素朴な試みは : かもしれませんがf f1 x = ' '、これは型になりf :: a -> b -> Charます。f1が関数であるべきという事実が知られていないため(実際には、他の何かを として渡すことができますf1)、2 番目の引数と同じ型を受け取るという事実も知られていません。

代わりに: を実行f f1 x = ' ' where _ = f1 xすると、タイプは になりますf :: (a -> b) -> a -> Char。この場合、コンパイラは f1 が少なくとも 1 つの引数を取る必要があり (引数に適用しているため)、引数は 2 番目の引数の型を持っている必要があることを認識しています (2 番目の引数に適用しているため)。

編集3:

Haskell 構文について一言。

関数宣言は次のようになります。f arg1 arg2 = expr

arg1との位置に入るものarg2はパターンです。入るのexprは式です。

次のようなものが表示された場合

f x = y
  where y = x + 1

句の前にあるのwhereは式であり、その後にあるのは式に表示される宣言です。トークンの前の改行whereは重要ではありません。上記は と同じですf x = y where y = x + 1

パターンとは パターンを使用すると、値をパーツに分解し、パーツを名前にバインドできます。

xは、id x = xたとえば のパターンです。これは、xが の最初の引数にバインドされていることを意味しますidx右側の はパターンではなく左側のパターンxによってバインドされたの値を持つ式です。

(a, b)のように、別のパターンfst (a, b) = aです。このパターンは、入力型が 2 タプルで、最初の要素が にバインドされa、2 番目の要素が にバインドされる必要があることを示していbます。

ではmkPair a b = (a, b)(a, b)パターンではなく式です。aこれは、最初の要素が(左側の最初の引数としてバインドされている) で、2 番目の値b(右側から 2 番目の引数としてバインドされている)である 2 タプルの値を持つ式です。

関数の引数の位置は常にパターンです。パターンは式のように見えるかもしれませんが、そうではありません! コードの一部が式であるかパターンであるかは、それがどのように見えるかではなく、他のすべてのものとの関係でどこに現れるかによって決まります。

于 2013-05-22T00:52:51.513 に答える