2010-12-01 10 views
1

ご挨拶、私はHaskellを初めて使用しており、割り当てのデータ型を定義することに固執しています。Haskellでのデータ型の定義

「戦略」タイプを作成する必要があります。基本的には、それぞれ数値を表す1〜6文字の文字列で、9以上の値を文字(最大35個の異なる合計値)考えられる各値を表す補助型を定義し、それを使用して型を作成しようとしましたが、コードが機能していないため、アイデアがなくなりました。これは私がしようとしている定義です:

data Value = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'A' | 'B' | 
'C' | 'D' | 'E' | 'F' | 'G' | 'I' |'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 
'Q' |'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'Y' | 'X' | 'Z' 

data Strategy = Value | Value:Value | Value:Value:Value | 
Value:Value:Value:Value | Value:Value:Value:Value:Value |    
Value:Value:Value:Value:Value:Value 

は、値の種類が番号を受け付けていません、と戦略型「の一種は、」それはバストを行くされた後、第2のコンストラクタまで動作します。ご協力いただきありがとうございます!

+0

...また別の話です。あなたはすぐに正しいコードで答えを得るだろうが、それを理解する必要がある!データ型は可能な値の列挙ではありません(実際には、より抽象的な観点からのものですが、このようにはうまく機能しません)。 – delnan

+0

あなたの入力のおかげで、私はこれを理解する必要があります、実際には、私は(コンストラクタのいずれかのパラメータを持っていない限り、私はjavaで言うと列挙型を作成するデータ型を使用することができたという印象の下にあった。私は、戦略型で動作するいくつかの関数を定義しているので、値を操作できるようにするために「導出(Eq、Ord、Enum)」を使用できるようにすることも目的でした。 – user526861

+0

データ型は、列挙に使用することができます(そして実際には) - あなたが言ったように、パラメータのないいくつかのコンストラクタ。 stdlibの実際の例: 'data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode'である。あなたはデータ型について少し知っているようですね? – delnan

答えて

6

以前の(削除された)質問のように、これは宿題のように見えます。また、実際の名前を選択してこのスローアウェイアカウントを使用しない場合に役立ちます。

This pageは、haskellのdata型宣言の使い方を説明しています。あなたは違う/間違って何をしていますか?

  1. Valueのコンストラクタの代わりに文字を使用します。 '1''2'、などはすべて文字である、あなたはあなたがリストコンストラクタと私は仮定を使用しているValueCon1 CharValueCon2 String

  2. のようなゼロ以上のフィールドと一緒に、コンストラクタを必要とするValueの分野ではなく、Strategyのために新たなコンストラクタを定義します。おそらくdata Strategy = Strat [Value]が必要です。これは任意のサイズのリストを受け入れます。より痛みを伴うのに対し、有限個の個別のValueフィールドを持つ多数の戦略コンストラクタを定義できます。

ご利用のコースはどこですか?これらの基礎をカバーすることは、期限が遅れているようです。私は実際にそれを行うだろうか

+0

あなたの答えをありがとう、実際に私はちょうどに登録しました、これは使い捨てのアカウントではありません、私は質問を削除しませんでした。私は最大6つの可能な文字を必要とするので、多くの戦略コンストラクタを定義するというあなたの提案を試みます。これはHaskellをベースとしたコースプロジェクトの一部ですが、関数を扱う際やデータ型に苦しんでいるときは、正しい型を持たずにはるかに遠くになることはできません。 – user526861

+0

@user:いくつかのコンストラクタでは、 "cons"( "const' =': ')はまだ動作しません。宣言では型付きを指定しますが、 'cons'は型ではなく(特別な構文を持つ非常に重要なものですが)コンストラクタです。型は、サイズが制限されていないリストです。あなたが制限する場合は、タプル( '(Value、Value)'は2つの 'Value'であり、他のリスト関数は動作しません。 – delnan

+0

答えの最初の部分については、 "day = Monday | Tuesday | etc"のような平日型を定義する例に従っていましたが、これは列挙型の例として使用されていました。似たようなことをしますが、各コンストラクタが文字である場合、私は 'マークを削除しようとしましたが、インタプリタは型の要素として数値を使うことはできませんでした... – user526861

1

type Strategy = [Char]

^^。義務はナンセンスでそれを埋めるしないようにあなたの上にあるよう

かは、多分

newtype Strategy = Strategy [Char]

これは、あまり理にかなっています。 newtypeソリューションを使用すると、 "スマートコンストラクタ"を使用することができます。

mkStrategy :: [Char] -> Strategy 
mkStrategy x 
    | {- list is valid -} = Strategy x 
    | otherwise = error "you gave me a bad strategy!" 

は、実際のコードでは、エラーをスローしますが、オプションのタイプを返すようにしたくない、それはあなたがデータ型についての根本的な何かを見逃しているためだそれ

+0

これは実際に私がやったことです私の問題はずっと簡単になりましたが、私は「望ましくない」値を扱うことについては不明です。ご回答有難うございます! – user526861

関連する問題