2

私はHaskellで遊び始め、いくつかのチュートリアルと公式の本(lyah)を読みました。初めての個人的なプロジェクトを開始できると感じました。そして、私が選んだ新しい言語に関しては、線形代数処理 (行列、ベクトルなどの操作) 用のパッケージを実装したいと考えていました。関数は問題ありませんが、データ型については行き過ぎていません。

もともと、次のような関数がありました。

     add_vect :: (Num a) => [a] -> [a] -> [a]
     add_vect x y = zipWith (+) x y

ここで、意味に名前 ( Vector) を付けたいので、次のようになります。[a]vect_add

    vect_add :: Vector -> Vector -> Vector
    vect_add x y = zipWith (+) x y

多くの野心的な試みの後、私は ( の定義に触発されてString) 非常に単純な定義にたどり着きました:

    type Vector = [Int] 

[Int]これの問題は、数値型の代わりにのみ機能する関数の型ジェネリック性を失うことです。

私の質問は次のとおりです。新しい型の定義にジェネリック性を表現する方法はありますか (たとえば型呼び出しを使用)。次のようなもの:

    type Vector = (Num a) => [a]

Vectorまたは、私のジェネリック性を維持する他の方法はありますか?

4

3 に答える 3

3

型チェッカーは 3 つのベクトルがすべて同じ型であることを知る方法がないため、やりたいことができません。それ以外の場合は、次のようなコードを記述できます。

mkVect :: [a] -> Vector   -- You are going to need something with this type.


x1 :: [Int]
x1 = [1,2,3]
x2 :: [Double]
x2 = [1.0,2.0,3.0]

v3 = add_vect (mkVect x1) (mkVect x2)

型チェッカーがこれを停止できる唯一の方法は、Vector の型パラメーターを add_vect の一部として持つことです。

したがって、代わりに書く必要があります

type Vector a = [a]

そうすれば、型チェッカーはあなたが何をしているかを見ることができます。

于 2013-07-26T11:05:43.923 に答える
0

「正しい」方法の 1 つはVector、ドキュメントの目的でのみ使用しているためtype Vector a = [a]、悪いことではないことに注意することです。次に、vect_add :: Vector a -> Vector a -> Vector awhich が一致する必要vector-spaceがあり、さらに(*^) :: a -> Vector a -> Vector a.

于 2013-07-26T14:10:34.553 に答える