0

私は完全な Haskell n00b ですが、単純な数値のリストである新しいデータ型を定義したいと考えています。どうすればこれを行うことができますか?型宣言に関する Haskell wikibook やその他のオンライン リソースを読みましたが、理解できないようです。本質的に、私が試したことは次のとおりです。

type NumList = [Num]

それはうまくいかなかったので、どうすればこれを行うことができますか? 助けてくれてありがとう。

4

3 に答える 3

2

typeキーワードは型の同義語 (既に存在する型の新しい名前) のためのものであるため、 のようなクラスは使用できませんNum

代わりに、dataキーワードを Haskell のコンテキスト表記と一緒に使用できます。

data Num a => NumList a = NumList [a]

ghci でそれを試した場合を除いて、データ型コンテキストが非推奨であるため、叱られます。どうやら、GADT を使用したほうがよいようです。おそらく次のようなものです:

data NumList a where
    Empty :: Num a => NumList a
    Singleton :: Num a => a -> NumList a
    Append :: Num a => NumList a -> NumList a -> NumList a
于 2013-10-19T03:09:29.357 に答える
1

正確なニーズに応じて、いくつかの答えがあります。特定のアプリケーションの番号のリストが必要な場合は、この場合に使用する正確なタイプの番号を知っている可能性があり、次を使用する必要があります。

type DoubleList = [Double]

(DoubleList は [Double] と比較してまったく利点がないため、より明確な名前を付けてほしいと思います)

NumList を使用するすべての関数でNum aコンテキストを使用するように強制したい場合 (ただし、自動化されないため、このメソッドは推奨されません) を使用できます。

data Num a => NumList a = NL [a]

(Num a) => ...[a]....これはおそらく悪い考えですが、コード内で を使用することに何の影響もありません。

リスト内の数値の正確なタイプが何であるかを気にせず、それらの間で操作を行うことができる場合 (ただし、2 つの NumList 間では操作を行うことはできません) は、存在型を使用できます。

data NumList = forall a . (Num a) => NL [a]

これはオブジェクトに最も似ていますが、タイプの消去とリフレクションがない場合、NumList を使用して多くのことを行うことはできません (追加することはできますが、この時点では、必要のない困難を積み上げているだけだと確信しています)。 Haskell で Java/C++/Other を書こうとしているからです)。

数字のリストの Num インスタンスを作成したい場合は、次のようにするだけでよいことに注意してください。

instance (Num a) => Num [a] where ...

私の最終的な推奨事項は[a]、適切なNum aコンテキストで使用することですが、さらなるガイダンスを受ける場合は、このタイプの使用に関する詳細を提供する必要があると誤解されている場合.

于 2013-10-19T13:18:39.283 に答える