8

Haskellで部分的に適用された型のデータコンストラクタを作成することは可能ですか?

ghci セッション:

Prelude> data Vector a b = Vector {x::a, y::b}
Prelude> :t Vector
Vector :: a -> b -> Vector a b
Prelude> type T1 = Vector Int
Prelude> :t T1
<interactive>:1:1: Not in scope: data constructor `T1'
Prelude> let x = Vector
Prelude> let y = T1
<interactive>:46:9: Not in scope: data constructor `T1'

T1 型のデータ コンストラクターを作成したいのですが、可能ですか? または、そのような関数を手動で定義することはできないため、newtypes を使用する必要がありますか?

4

4 に答える 4

1

のコンストラクタが既に存在しT1、次の名前が付けられていVectorます。

*Main> :t Vector :: Int -> b -> T1 b
Vector :: Int -> b -> T1 b :: Int -> b -> T1 b
于 2013-07-24T03:38:59.567 に答える
1
Prelude> type T1 = Vector Int

これにより、 のコンストラクターが作成されVector Intます。型引数を指定するため、 here はVectorコンストラクターとして使用されることに注意してください。タイプの種類を次のようにクエリできます。T1:k

Prelude> :k T1
T1 :: * -> *

これは、 が具象型 ( ) を取り、具象型を返すT1型コンストラクタであることを示しています。*

データコンストラクターを作成するには、データコンストラクターの最初のパラメーターにデータ値を指定する必要があります。Vector

Prelude> let t1 = Vector 5
Prelude> :t t1
t1 :: b -> Vector Integer b

(宣言の左側と右側で同じ名前を使用したため、 type*コンストラクターとデータVectorコンストラクターの両方であることに注意してください。)data

于 2013-07-24T19:15:43.513 に答える