2016-02-28 52 views
-2

我在哈斯克爾的鍛鍊,我需要創造各種types.The第一類被稱爲有限被這樣定義:功能獲取整型並返回一個列表

type Finite a = [a] 

,然後我需要返回的是這樣

singleF :: a -> Finite a 

定義一個單身,所以我實現它,像這樣:

single n = [n] 

然後下旬R I創建另一種類型的

type Enumeration a = Int -> Finite a 

然後我需要重新實現單功能

singleE :: a -> Enumeration a 

在我的理解類型Enumeration是從int到a類型的列表功能的代名詞,但我無法理解我能如何實現這一點。

從練習(以前的類型'有限'也被稱爲'桶'):An enumeration is an infinite sequence of finite buckets, indexed by natural numbers

而且功能單一:I suggest for simplicity that you put the sole item in bucket 0,所以我在想,int是枚舉

+2

有很多不同的方法可以做到這一點 - 你希望枚舉具有什麼_properties_? (整數是否應該決定列表長度,_maximum_長度,起始位置......或者完全不同的東西) – leftaroundabout

+0

@leftaroundabout練習(以前的類型'Finite'也被稱爲'bucket'): '枚舉是一個無限序列的有限桶,由自然數索引。'而函數單:'我建議爲了簡單起見,你把唯一的項目放在桶0中,所以我認爲'int'是枚舉中桶的索引。 –

+1

您應該將該信息編輯到問題中。 – leftaroundabout

回答

5

桶的把我的頭頂部的指標:

singleE :: a -> Enumeration a 
singleE a 0 = singleF a 
singleE _ _ = [] 

main :: IO() 
main = do 
    let s=singleE 'a' 
    print $ s 0 
    print $ s 5 

給人

"a" 
"" 

singleE爲您提供了一個函數,它接受一個I​​nt並返回一個Finite。如果你傳遞0,你會得到一個有限單元,否則是空的。

+0

不是'singleE'定義的,它的函數需要'a'並返回一個返回列表的函數? –

+2

哦,我想我現在明白了!我可以像這樣替換'singleE :: a - > Int - > Finite a',這意味着我現在可以獲得'Int'!非常感謝! –

+0

@EliBraginskiy另一種方法是返回一個lambda:'singleE a = \ n - > if n == 0 then singleF a else []'(您也可以使用'case'而不是'if') – chi