19

何が問題なのか教えてください。

data Stack' v = Stack' [v] Int の導出 (表示)
...
タイプ StackInt = Stack' Int

メイン = 印刷 (StackInt [1,2,3] 4)

私が得ているエラーは

範囲外: データ コンストラクター「Stackint」

なにが問題ですか?

4

3 に答える 3

32

型とコンストラクターの概念を混同しているように見えますが、これらは別々の名前空間に存在し、同じ名前が付けられることが多いため、これは一般的な問題です。Haskell式で

data SomeType = SomeType Int

SomeTypeたとえば、実際には型とコンストラクター を定義しているとしSomeTypeます。型は通常の意味での関数ではありませんが、コンストラクターは関数です。ghciにSomeTypeのタイプを尋ねると、次のようになります。

:t SomeType
SomeType :: Int -> SomeType

さて、type宣言はより長い型定義の省略形であり、あなたの場合は。StackIntの同義語を作成しますStack' Int。ただし、このタイプの値を作成するには、コンストラクターStack'(タイプは[v] -> Int -> Stack' v)を使用する必要があります。したがって、コードは次のようになります。

data Stack' v = Stack' [v] Int deriving (Show)

main = print(Stack' [1,2,3] 4)

タイプが正しいことを確認したい場合は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)

編集:stackInt list i = Stack' list iここで透明性のために書いたわけではありませんが、と同じようにもっとエレガントに書くことができます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)
于 2012-09-06T14:18:50.020 に答える
16

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

于 2012-09-06T14:10:44.437 に答える
2

というデータコンストラクタはありませんStackint。宣言でStackint定義されているように、コンストラクターです。type

データ コンストラクターは , と同様ですがStack'Stack'型シノニムのおかげで .Int -> Stack' Intの代わりに型を持つことになりますa -> Stack' a

于 2012-09-06T14:14:12.423 に答える