2011-10-20 98 views
0

我是一個沒有過去功能編程經驗的新手(但是,程序/命令編程經驗頗多)。我在理解如何聲明自己的數據類型的過程中遇到了一些麻煩。Haskell數據類型語法與操作

例如,假設我宣佈一個數據類型:

data SomeThing = Int [Int] 

你會如何編寫一個Haskell函數消耗someData併產生someData;只有生成的數據的Int是消費數據[Int]中所有元素的總和,消費值[Int]在生成的[Int]中每個元素都乘以2。

這顯然是可能的,但我沒有找到任何答案,在網絡搜索後對我有意義。

回答

6

首先,你在你的數據類型聲明是錯誤的。從你的問題中,你想要一個數據類型,其中包含一個Int和一個Int列表,但你錯過了一個數據構造函數 。這是模式匹配時或構建數據類型的新值時使用的標籤。

data SomeThing = SomeThingConstr Int [Int] 

這是常見的命名構造函數的數據類型本身同樣的事情,只有一個的時候,但我已經給了他們在這裏單獨的名稱,以避免混淆。

現在很容易使用模式匹配和這個數據構造函數來編寫你的函數。

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

(。從您的文章引用我懷疑它會被編輯)

例如,假設我宣佈一個數據類型:

data SomeThing = Int [Int] 

你會如何編寫一個Haskell函數消耗someData和 產生一個someData;只有生成的數據的Int是消費數據的[Int]中所有元素的總和,以及消耗的值爲[Int]的元素在生成的 [Int]中已經使每個元素乘以2。

我想你指的是數據類型爲

data SomeData = SomeData Int [Int] 

那麼你一定要

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