4

初心者として、これが許可されていない理由は明らかではありません。

data Pair = Pair a b

つまり、なぜ doPair 5 "foo"Pair 'C' []HAVE が異なる型を生成する必要があるのでしょうか? 両方が type の値を作成できないのはなぜPairですか?

「Learn you a」、RWH、および Haskell WikiBook から学んでいますが、探しているパラメータ化された型を記述する正確で不安定な言語を見つけることができませんでした。

4

2 に答える 2

10

基本的に、問題は の内容に関する情報がないことですPair任意の型の値が含まれていることだけがわかっている場合、使用できる唯一の実際の関数は ですid。これはかなり役に立ちません!

問題は、各値が any になる可能性があるため、それらについてまったく保証がないことです。したがって、使用することさえできませんでし==た: 値が関数だったらどうなるでしょうか? 関数が等しいかどうかを比較することはできません!

仮定の型に作用する関数を書くことを想像してくださいPair:

fn (Pair a b) = ...

aと で他にどのような機能を使用できますbか?

Int -> Intが. _ a_ が数値かどうかさえわからないため、Intより複雑な型は機能しません。機能する唯一の関数は、またはのような型を持つ関数です。ただし、最初のタイプの唯一の合理的な機能は 2 番目のタイプの合理的な機能はまったくありません。Num n => n -> nat1 -> t1t1 -> t2id

これで、「この関数を試してみます。型が機能しない場合は、エラーをスローします」と言うことができます。しかし、これは動的型付けになり、基本的に型システムを完全に捨てることになります。これはひどいように聞こえますが、場合によっては理にかなっている場合もあるため、 を使用Data.Dynamicしてそのようなことを行うことができます。ただし、初心者として心配する必要はありません。また、使用する必要がない可能性もあります。私は今のところ使用していません。完全を期すためにそれを含めています。

于 2012-05-24T22:03:52.860 に答える
4

存在型言語拡張を使用すると、そのような型を定義できます。

{-# LANGUAGE ExistentialQuantification #-}

data Pair = forall a b. Pair a b

a, b :: Pair                                
a = Pair 1 2
b = Pair "abc" 'x'

ここではabの両方が同じタイプです。

通常、これはこの方法では行われません。これは、 a で何か有用なことを行うPairには、その内容を知る必要があり、 の定義によってPairその情報がすべて削除されるためです。

したがって、本当に必要な場合はそのような値を作成できますが、それらを使用して役立つものを見つけるのは困難です。

于 2012-05-24T22:28:06.037 に答える