は、例としてfmap
の型シグネチャ(Functor
方法)を取る:ハスケル型署名のかっこの意味は?
(a -> b) -> f a -> f b
方法は、以下の型シグネチャとは異なることがありますか?
a -> b -> f a -> f b
これらの2つのタイプシグネチャには違いがありますか?
は、例としてfmap
の型シグネチャ(Functor
方法)を取る:ハスケル型署名のかっこの意味は?
(a -> b) -> f a -> f b
方法は、以下の型シグネチャとは異なることがありますか?
a -> b -> f a -> f b
これらの2つのタイプシグネチャには違いがありますか?
はい、違いはあります。the ->
type constructor is right-associativeです。換言すれば、
a -> b -> f a -> f b
この型シグネチャ自体がタイプ
b
のパラメータを受け取り、返す関数を、タイプ
a
のパラメータを受け取り、返す関数を示し
a -> (b -> (f a -> f b))
と等価です関数自身はf a
型のパラメータを取り、タイプf b
の値を返します。一方
、
(a -> b) -> f a -> f b
型a -> b
(タイプa
のパラメータを取り、型b
の値を返し、すなわち関数)のパラメータをとり、関数を返す関数を示し、それ自体はタイプf a
のパラメータを取り、タイプf b
の値を返します。
f :: (Int -> Bool) -> [Int] -> [Bool]
f = map
g :: Int -> Bool -> [Int] -> [Bool]
g n b = map (\n' -> (n' == n) == b)
λ> let ns = [42, 13, 42, 17]
λ> f (== 42) ns
[True,False,True,False]
λ> g 42 True ns
[True,False,True,False]
λ> g 42 False ns
[False,True,False,True]
はい、
(a -> b) -> ...
は "Bにかかる機能を与えられた..." という意味。この
a -> b -> ...
を意味し、 "...一部a及びいくつかのBを与え" a -> b -> ...
は、2つの引数を意味し、一方
はい、(a -> b)
は、署名a -> b
持つ関数である一つの引数を意味します。
どのようにタイトルのテキストや問題の質問が関連している:
ここでは、2つの型シグネチャの違いを示して不自然な例はありますか?型シグネチャの中の括弧は、特別なセマンティクスを表すものではなく、Haskellの他の場所と同じように、優先順位のために2つのスニペットが同等ではない*です。 –
@JörgWMittag:2つの質問が*同等*ではないことに同意します - 実際は異なる回答がありますが、あなたはそれらが無関係*であることに驚いています。どちらも、型シグネチャのカッコの意味に関するものです。タイトルの質問に対する「はい」の回答は、おそらくテキストの質問に対する「はい」の回答を伴います。いずれかの質問に対する良い答えは、おそらく暗黙的に(または明示的に)他方に答えるだろう。 – ruakh
型シグネチャのカッコは、優先順位と同じように優先順位を示します。優先順位は純粋に*構文*プロパティであり、意味的な意味はありません。したがって、型シグネチャのかっこは特別な意味でもセマンティクスでもないので、2つのスニペットは同じではなく、 'a + b * c'や'(a + b)* c'と同じではない構文上の優先順位があり、セマンティクスのためではありません。 –