2014-11-25 74 views
-6

我有haskell函數(讓我們稱之爲'愚蠢'),它調用3個不同的函數。這三個不同的函數返回不同的類型,例如布爾值或布爾值列表。我如何定義函數'dumb'來返回布爾值或布爾值列表?我如何在haskell中有一個函數返回布爾值或布爾值列表?

data Sumtype = givelist Integer | getprod Integer 
prod :: Int -> Int 
prod x = x*3 

listnums :: Int -> [Int] 
listnums x = [1...x] 

dumb :: Sumtype -> (what comes here..?) 
dumb (givelist x) -> listnums x 
dum (getprod x) -> prod x 
+3

你應該給出一個具體的例子來說明你想如何使用這樣一個函數。 – ErikR 2014-11-25 00:52:11

+0

這個怎麼樣?我希望這能清除我的問題。 – Reeshabh 2014-11-25 08:52:38

+0

您編輯的代碼嚴重不完整。 – gspr 2014-11-25 09:06:08

回答

6

你讓它返回Either Boolean [Boolean]。但我對你的動機持懷疑態度。這聽起來像是一個X/Y問題。

+0

不知何故Either關鍵字不起作用。 – Reeshabh 2014-11-25 00:44:50

+0

應該是其他函數,例如,如果啞調用add函數也被聲明爲返回整型類型?我只是不能通過聲明它返回無論運行愚蠢的函數布爾[布爾] – Reeshabh 2014-11-25 00:47:32

+6

@Reeshabh ['無論'](http://hackage.haskell.org/package/base-4.7.0.1/docs/Data-或者.html)是一個類型構造函數,而不是關鍵字。 – 2014-11-25 00:51:26

1

您可能正在尋找Either類型,但使用它您的函數將返回Either值。它的定義是這樣的:

data Either a b = Left a | Right b 

當你要定義一個可以返回一個bool或BOOLS的列表中的類型應該是這個樣子的函數:

dumb :: Either Bool [Bool] 

在這種情況下,「啞'將是一個函數,它不會接受任何參數並返回一個Bool或一個Bools列表。在函數體可以返回一個bool這樣的:

Left bool 

或者這樣的bool的列表:

Right [bool] 

這裏你可以看到一個具體的例子:http://en.wikibooks.org/wiki/Haskell/More_on_datatypes#More_than_one_type_parameter

所有這一切說盡管如此,塞巴斯蒂安要求你瞭解更多細節的原因是,在任何錯誤處理之外很少使用它(AFAIK,無論如何我都知道)。在你的情況下,你可能根本不需要它,但除非你更多地告訴我們關於你使用'愚蠢'的其他功能和你的目標的信息,否則我們無法確定。

+0

我編輯了我的問題。你可以有一個loook嗎? – Reeshabh 2014-11-25 08:54:39

+0

@Reeshabh我不知道你想完成什麼。你想傳遞一個函數到'啞',然後將該函數應用於一個值? – HardRock 2014-11-25 09:24:42

+0

再次編輯我的代碼,這是否更清楚? – Reeshabh 2014-11-25 18:33:17

0

無關發生問題的

看樣子你是一個初學者 - 歡迎哈斯克爾!我強烈建議你閱讀並閱讀許多教程中的一篇,因爲它比提出單個問題更高效更完整。

語法

讓我們先從糾正語法錯誤。構造函數,如GivelistGetprod必須以大寫字母開頭。功能dumb被錯字一次。函數定義使用=而不是->

類型

現在我們有類型錯誤來解決。 Sumtype使用Integer,然後您切換到使用Int。爲了簡單起見,我們只需堅持Integer

有了這些修正,我們得到:

data Sumtype = Givelist Integer | Getprod Integer 

prod :: Integer -> Integer 
prod x = x*3 

listnums :: Integer -> [Integer] 
listnums x = [1...x] 

dumb :: Sumtype -> (what comes here..?) 
dumb (Givelist x) = listnums x 
dumb (Getprod x) = prod x 

問題

你想知道「什麼都來這裏」,其中「這裏」的結果類型。正如所寫,該功能實際上是無效的。一個定義產生一個整數列表[Integer],而另一個定義產生一個整數Integer。一個解決方案是使用和類型,如Either Integer [Integer] - 這是非常非常喜歡你現有的預Sumtype

dumb :: Sumtype -> Either Integer [Integer] 

所以現在我們需要在我們的函數定義返回的Either構造。你可以查看文檔或使用:info EitherGHCi學習構造函數,如果你沒有記住它們。

dumb (Givelist x) = Right (listnums x) 
dumb (Getprod x) = Left (prod x) 

通知我們不得不使用Left爲它返回一個Integer第二種情況下,因爲第一類我們寫了之後Either(左型)是Integer

+0

如果我遵循相同的方法:無論是整數IO()它給我一個錯誤,說是應用於太多的參數。 – Reeshabh 2014-11-27 02:43:36

+0

因爲'Either'需要兩個而不是三個類型的變量。你想要:'整數(IO())'。實際上,你可能都不想要這些 - 我發現更有可能有更好的方法來完成你所做的任何事情,而不是'_(IO())' – 2014-11-27 04:09:50