2012-09-06 13 views
11

問題点を教えてください。範囲外: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' 

のですか?

答えて

19

タイプとコンストラクタのコンセプトが混乱しているように見えますが、これは別々の名前空間に住んでいて、同じ名前が付いているのでよくある問題です。

data SomeType = SomeType Int 

が言うHaskellの式では、あなたが実際にタイプSomeTypeコンストラクタSomeTypeを定義しています。型は通常の意味での関数ではありませんが、コンストラクタはです。あなたがSomeTypeのタイプにGHCiのを尋ねた場合は、これを取得します:

:t SomeType 
SomeType :: Int -> SomeType 

さて、type宣言はStackIntStack' 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) 
すなわち、新しい機能や型シノニムの両方を持つことができます
16

コンストラクタの名前は、ではなくStack'です。 typeを使用して型エイリアスを作成しても、コンストラクタのエイリアスは作成されません(型のコンストラクタが多数あり、その型名に型名がまったく関係していない可能性があるため意味がありません)。

2

Stackintというデータコンストラクタはありません。 type宣言で定義されたStackintタイプコンストラクタです。型シノニムのおかげで、それはタイプInt -> Stack' Intの代わりa -> Stack' aがあるでしょうが、

データコンストラクタは、Stack'Stack'用として、です。