1

コンストラクターの一部として String を含めたい:

> data Car = Wheel | Trunk | String deriving (Show)

> test::Car->Car->Car
> test Wheel Wheel = "Wheel"
> test _ _ = ""

それは言う:車と[Char]を一致させることができませんでした

コンストラクタを次のように変更すると

> data Car = Wheel | Trunk | [Char] deriving (Show)

それは言う:データ/ newtype宣言のコンストラクターのエラー:[Char]

では、コンストラクターの 1 つが文字列でもあるデータ型を作成するにはどうすればよいでしょうか。

4

2 に答える 2

7

CarHaskellは、データ型で使用したような名前のないユニオンを提供しません。データ型の定義の各要素には、コンストラクターが必要です。たとえば、次のデータ型を定義できます。

data Car = Wheel | Trunk | Constr String

この定義Constrでは、コンストラクターを示し、Stringその引数のタイプです。たとえば、をCar使用してタイプの値を作成できますConstr "Wheel"。上記の例でを省略すると、引数なしでString呼び出されるコンストラクターになります。Constr同様に、あなたの例でStringは、同じ名前の型が存在する場合でも、はコンストラクターです。

上記の定義により、次のようCarに定義できますtest

test :: Car -> Car -> Car
test Wheel Wheel = Constr "Wheel"
test _     _     = Constr ""

String定義の右側にコンストラクターを追加することにより、文字列がCarデータ型にリフトされます。ただし、コメントで述べたように、このような定義は、test常にタイプの値を生成するため、少し奇妙に思えStringます。したがって、別の可能な定義は次のようになります。

test :: Car -> Car -> String
test Wheel Wheel = "Wheel"
test _     _     = ""
于 2012-09-22T12:42:03.870 に答える
1

データ 車 = ホイール | トランク | 文字列の導出 (表示)

Carここでは、コンストラクターWheelTrunkおよびで宣言していますString。YourStringは標準の String 型とは異なるため、同じではありません。したがって、単純に のような文字列と一致させることはできません""。文字列値を指定する場合は、コンストラクターが文字列を受け入れるようにします。たとえば、次のようにします。

data Car = Wheel | Trunk | CarName String deriving (Show)

そして、次のように使用できます。

test::Car->Car->Car
test Wheel Wheel = CarName "Wheel"
test _ _ = CarName ""

この関数の結果は、コンストラクターと一致する必要があります。たとえば、次のようになります。

let x = test Wheel Wheel 
in case x of
     Wheel -> ... -- do something if it's wheel
     Trunk -> ... -- do something if it's trunk
     CarName x -> ... -- do something if it's carname, you can use the returned x
于 2012-09-22T12:50:48.957 に答える