uFunc0D
where
は使用されません (同じ名前の関数で句の引数をシャドウします)
' '
は文字リテラルを示し、1 文字を含む必要があります。文字列のことを考えているかもしれませんが、その場合""
は空の文字列です。
- への引数は、入力引数および と
uFunc1D
はまったく関係がないため、自由に異なる型にすることができます。x
y
編集:
戻り値の型に影響を与えるには、式 (等号の右側) で引数を使用する必要があります。句での宣言により、andがwhere
導入されます。の宣言は、関数の引数 (左側) のバインディングを隠します。そのため、たとえrhs で言及したとしても、引数ではなく、where 句で宣言したものになります。uFunc0D
uFunc1D
uFunc0D
uFunc0D
uFunc0D
編集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 タプルの値を持つ式です。
関数の引数の位置は常にパターンです。パターンは式のように見えるかもしれませんが、そうではありません! コードの一部が式であるかパターンであるかは、それがどのように見えるかではなく、他のすべてのものとの関係でどこに現れるかによって決まります。