何が問題なのか教えてください。
data Stack' v = Stack' [v] Int の導出 (表示) ... タイプ StackInt = Stack' Int メイン = 印刷 (StackInt [1,2,3] 4)
私が得ているエラーは
範囲外: データ コンストラクター「Stackint」
なにが問題ですか?
何が問題なのか教えてください。
data Stack' v = Stack' [v] Int の導出 (表示) ... タイプ StackInt = Stack' Int メイン = 印刷 (StackInt [1,2,3] 4)
私が得ているエラーは
範囲外: データ コンストラクター「Stackint」
なにが問題ですか?
型とコンストラクターの概念を混同しているように見えますが、これらは別々の名前空間に存在し、同じ名前が付けられることが多いため、これは一般的な問題です。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)
コンストラクタの名前はStack'
ではなくStackInt
です。を使用して型エイリアスをtype
作成しても、コンストラクターのエイリアスは作成されません (型には多くのコンストラクターが存在する可能性があり、それらの名前は型名に関連付ける必要がないため、これは意味がありません)。
というデータコンストラクタはありませんStackint
。宣言でStackint
定義されているように、型コンストラクターです。type
データ コンストラクターは , と同様ですがStack'
、Stack'
型シノニムのおかげで .Int -> Stack' Int
の代わりに型を持つことになりますa -> Stack' a
。