いいえ:
Branch :: (Tree a, Tree a) -> Tree a
、あなたはそれをタプルを養うために持っている、などコンストラクタを呼び出す必要があります。
Branch (tree1,tree2)
Branch
は、しかし、シグネチャがあります。
Branch :: Tree a -> Tree a -> Tree a
明示的かっこで:
Branch :: Tree a -> (Tree a -> Tree a)
あなたはBranch tree1
のような最初のパラメータ、Branch
を養うときに、シグネチャは次のとおりです。
(Branch t1) :: Tree a -> Tree a
あなたが最終的にそれを二番目のパラメータt2
を供給する場合、その型はに崩壊する:
((Branch t1) t2) :: Tree a
さらに便利な例は、たとえば(+)
です。 hはコンストラクタではなく関数です。 (+)
当社プラス(+)
は、署名に
(+) :: Int -> Int -> Int
(Haskellsをプラスもう少し汎用的ですが、今度はこれを考慮しないようにしましょう)があります。
あなたが今(5+)
を書く場合は、関数にあなたの機能を専門にしている。言い換えれば
(5+) :: Int -> Int
あなたが与えられた数に5
を追加します新しい機能を構築しました。
(a,b) -> c
とa -> b -> c
のための署名がしかし、ビットの同等なので、Haskellはcurry
とuncurry
機能を提供:あなたは、インスタンスのためにあるべきBranch
のための追加的なコンストラクタを必要とすることを決定した場合
curry :: ((a, b) -> c) -> a -> b -> c
uncurry :: (a -> b -> c) -> ((a, b) -> c)
をタプルを渡すと、そのようなコンストラクタを構築できます:
branchTuple :: (Tree a, Tree a) -> Tree a
branchTuple = uncurry Branch
両方の場合に1つの_type_パラメータがあります: 'a'。 –