無關發生問題的
看樣子你是一個初學者 - 歡迎哈斯克爾!我強烈建議你閱讀並閱讀許多教程中的一篇,因爲它比提出單個問題更高效更完整。
語法
讓我們先從糾正語法錯誤。構造函數,如Givelist
和Getprod
必須以大寫字母開頭。功能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 Either
的GHCi
學習構造函數,如果你沒有記住它們。
dumb (Givelist x) = Right (listnums x)
dumb (Getprod x) = Left (prod x)
通知我們不得不使用Left
爲它返回一個Integer
第二種情況下,因爲第一類我們寫了之後Either
(左型)是Integer
。
你應該給出一個具體的例子來說明你想如何使用這樣一個函數。 – ErikR 2014-11-25 00:52:11
這個怎麼樣?我希望這能清除我的問題。 – Reeshabh 2014-11-25 08:52:38
您編輯的代碼嚴重不完整。 – gspr 2014-11-25 09:06:08