2011-10-20 10 views
0

私は過去には関数型プログラミング経験のない初心者です(しかし、手続き型/命令型プログラミングの経験はかなりあります)。自分のデータ型を宣言する方法を理解することに少し苦労しています。例えば操作を伴うHaskellデータ型構文

、私はデータ型を宣言したと言う:

data SomeThing = Int [Int] 

どのようにあなたがsomeDataが消費してsomeDataがを生成Haskellの機能を記述します。生成されたデータのIntは、消費されたデータの[Int]のすべての要素の合計であり、消費された値の[Int]は、生成された[Int]のすべての要素に2を掛けた値です。

これは明らかに可能ですが、ウェブ検索後に私にはわかりやすい答えが見つかりませんでした。

data SomeThing = Int [Int] 

あなたが消費するHaskellの関数を書くだろうか。例えば

答えて

6

まずしたい、あなたはあなたのデータ型宣言に間違いがあります。あなたの質問から、IntのデータタイプとIntのリストが必要ですが、データコンストラクタ が欠落しています。これは、パターンマッチングやデータ型の新しい値を作成するときに使用されるラベルです。

data SomeThing = SomeThingConstr Int [Int] 

1つだけありますときに、データ型自体と同じことコンストラクタに名前を付けることが一般的ですが、私は混乱を避けるために、それらをここに別の名前を与えてくれました。

パターンマッチングとこのデータコンストラクタを使用して関数を記述するのは簡単です。

foo :: SomeThing -> SomeThing 
foo (SomeThingConstr _ xs) = SomeThingConstr (sum xs) (map (*2) xs) 

というか、あなたは何を意味するのかは明らかではありませんIntと呼ばれるデータコンストラクタを持っています。

+0

エラーはありません。データコンストラクタは 'Int'と呼ばれます。 –

+0

@FrerichRaabe:コンパイルエラーではありませんが、それは明らかにOPが望んでいたものではありません。 – hammar

+1

@FrerichRaabe OPは出力データを別々の 'Int'と' [Int] 'フィールドを持つものとして参照します。 – dave4420

1

(。私はそれを編集してしまいます疑いがあるとして、あなたのポストから引用)

は、私がデータ型を宣言したと言いますsomeDataおよび はsomeDataを生成します。生成されたデータのIntのみが消費データ[Int]のすべての要素の合計であり、生成された [Int]内の消費された 値の[Int]はすべての要素に2を掛けた要素の合計です。

私はあなたが

data SomeData = SomeData Int [Int] 

するデータの種類を意味推測その後、あなたはすべての

f :: SomeData -> SomeData 
f (SomeData _ ys) = SomeData (sum ys) (map (2 *) ys)