2017-05-01 71 views
2

我有這樣的數據和類型:哈斯克爾 - 無限名單 -

data Cliente = Uncliente {nombre::String,resistencia::Int,bebidas::[Bebida],amigos::[Cliente]} deriving (Show) 

type Bebida = Cliente -> Cliente 

type Nombre = String 
type Duracion = Float 
type Acciones = [Bebida] 
type Itinerario = (Nombre,Duracion,Acciones) 

我有這樣的標語:

「定義查克·諾里斯,誰是誰最初叫顧客‘查克’,有阻力1000,是安娜的朋友,拿走了宇宙中存在的所有蘇打水,從1級蘇打水開始,然後是2級蘇打水,等等。「

和我做的:

chuckNorris = Uncliente { 
    nombre = "Chuck", 
    resistencia = 1000, 
    bebidas = [soda 1,2..], 
    amigos = [ana] 

但是,這並不工作,因爲飲料無限列表不喜歡

你會如何寫無限的名單?

像蘇打1,蘇打2,蘇打3 ........

回答

3

我把它寫成map soda [1,2..]

map實際上取每個元素列表中的(1,2,3等等),並將soda應用於它,導致另一個列表soda 1,soda 2,soda 3等。

3

要做到這一點的方法是通過map函數。可以使用..語法來完成無限列表,其步驟爲1

map soda [1..] 

這是語義上等同於像

[soda 1, soda 2, soda 3, {- and so on... -}] 

原因這部作品是由於Haskell的惰性計算。對於soda的調用只有在您開始遍歷無限列表時纔會發生,因此無需擔心在此陷入無限循環。