問題点を教えてください。範囲外:Haskellのデータコンストラクタ
data Stack' v = Stack' [v] Int deriving (Show) ... type StackInt = Stack' Int main = print(StackInt [1,2,3] 4)
私は取得していますエラーが間違っている何
Not in scope: data constructor `Stackint'
のですか?
問題点を教えてください。範囲外:Haskellのデータコンストラクタ
data Stack' v = Stack' [v] Int deriving (Show) ... type StackInt = Stack' Int main = print(StackInt [1,2,3] 4)
私は取得していますエラーが間違っている何
Not in scope: data constructor `Stackint'
のですか?
タイプとコンストラクタのコンセプトが混乱しているように見えますが、これは別々の名前空間に住んでいて、同じ名前が付いているのでよくある問題です。
data SomeType = SomeType Int
が言うHaskellの式では、あなたが実際にタイプSomeType
とコンストラクタSomeType
を定義しています。型は通常の意味での関数ではありませんが、コンストラクタはです。あなたがSomeTypeのタイプにGHCiのを尋ねた場合は、これを取得します:
:t SomeType
SomeType :: Int -> SomeType
さて、type
宣言はStackInt
Stack' Int
の同義語を作るあなたの場合には、長い型定義のためだけの省略形です。しかし、この型の値を構築するには、コンストラクタStack'
(型は[v] -> Int -> Stack' v
)を使用する必要があります。未また、私はここで、透明性のためstackInt list i = Stack' list i
を書いたことを、:だからあなたのコードを使用すると、タイプがStack' Int
たことを確認してくださいしたい場合、あなたは機能
data Stack' v = Stack' [v] Int deriving (Show)
stackInt :: [Int] -> Int -> Stack' Int
stackInt list i = Stack' list i
main = print(stackInt [1,2,3] 4)
EDITを追加することができ
data Stack' v = Stack' [v] Int deriving (Show)
main = print(Stack' [1,2,3] 4)
する必要がありますstackInt = Stack'
のようにもっとエレガントに書くことができます。ここで正しいタイプを取得するのがタイプ制約です。あなたが望んでいた場合
また
data Stack' v = Stack' [v] Int deriving (Show)
type StackInt = Stack' Int
stackInt :: [Int] -> Int -> StackInt
stackInt list i = Stack' list i
main = print(stackInt [1,2,3] 4)
すなわち、新しい機能や型シノニムの両方を持つことができます
コンストラクタの名前は、ではなくStack'
です。 type
を使用して型エイリアスを作成しても、コンストラクタのエイリアスは作成されません(型のコンストラクタが多数あり、その型名に型名がまったく関係していない可能性があるため意味がありません)。
Stackint
というデータコンストラクタはありません。 type
宣言で定義されたStackint
はタイプコンストラクタです。型シノニムのおかげで、それはタイプInt -> Stack' Int
の代わりa -> Stack' a
があるでしょうが、
データコンストラクタは、Stack'
、Stack'
用として、です。