uFunc0Dwhereは使用されません (同じ名前の関数で句の引数をシャドウします)
' 'は文字リテラルを示し、1 文字を含む必要があります。文字列のことを考えているかもしれませんが、その場合""は空の文字列です。
- への引数は、入力引数および と
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が の最初の引数にバインドされていることを意味しますid。x右側の はパターンではなく、左側のパターンxによってバインドされたの値を持つ式です。
(a, b)のように、別のパターンfst (a, b) = aです。このパターンは、入力型が 2 タプルで、最初の要素が にバインドされa、2 番目の要素が にバインドされる必要があることを示していbます。
ではmkPair a b = (a, b)、(a, b)パターンではなく式です。aこれは、最初の要素が(左側の最初の引数としてバインドされている) で、2 番目の値b(右側から 2 番目の引数としてバインドされている)である 2 タプルの値を持つ式です。
関数の引数の位置は常にパターンです。パターンは式のように見えるかもしれませんが、そうではありません! コードの一部が式であるかパターンであるかは、それがどのように見えるかではなく、他のすべてのものとの関係でどこに現れるかによって決まります。