約Haskell type familiesの記事に続いて、私はそれを自分で試して勇気を見つけました。ネイティブのHaskellリストには「本当の」型名がありますか?または...私はここで間違って何をしていますか?
{-# LANGUAGE TypeFamilies #-}
class Iterable c where
data Iterator c :: * -> *
current :: Iterator c a -> Maybe a
next :: Iterator c a -> Maybe (Iterator c a)
instance Iterable [] where
data Iterator [] a = ListIterator [a] -- Problem in this line!
current (ListIterator []) = Nothing
current (ListIterator (x:xs)) = Just x
next (ListIterator []) = Nothing
next (ListIterator (x:xs)) = Just (ListIterator xs)
これは、上記のHaskellのチュートリアルで与えられたコード例のアナロジーである:まあリストは、私は右のアイデアを得た場合だけ見るために、すでにのApplicativeやその他もろもろであることを知って、私は次のことを実行しようとしました。 これは、ネイティブのHaskellリストのためにタイプファミリーIterable
を一般的に実装することです。
data Iterator [a] = ListIterator [a]
を書くために、代わりしようとしたが、これは私がここに表示されたコードと同じエラーメッセージが得られます。
temp.hs:8:19: error:
* Expecting one more argument to `[]'
Expected a type, but `[]' has kind `* -> *'
* In the first argument of `Iterable', namely `[]'
In the instance declaration for `Iterable []'
そこで、私の質問、私の代わりにリストの実際の型の名前を使用するオプションを持っている場合[]
の私の疑いのように、これは私の(構文的な)問題の原因です。
ハスケルは本当に「*ネイティブ*」リストではないと思います。リストは、Haskellコンパイラによって実装されなければならないものではなく、データ構造 'data [a] = [] |として定義されています。 (a:[a]) 'となります。 –
"temp.hs:13:37:error: データコンストラクタがスコープに含まれていません:いくつか:: a - >たぶん tempです。hs:15:34:error: データコンストラクタがスコープ内にありません: いくつか:: Iterator [] a - >多分(Iterator [] a) "ここに – BitTickler
あなたが引用したエラーメッセージは' [] ' 'Iterable'の最初の引数として、' Iterator'や 'ListIterator'とは関係がありません。' * - > * '(真)の' [] 'と言います。なぜなら、GHCがそれを期待していた理由を説明していたのですが、エラーメッセージを注意深く読めば、これをデバッグするように正しい質問にもっと近づけることができました。 – Ben