2012-03-29 35 views
2
rho x = map (((flip mod) x).(\a -> a^2-1)) (rho x) 

這個函數會產生一個無限列表。我在GHCI測試,功能類型是爲什麼Haskell能演繹[]在這個函數中輸入

*Main> :t rho 
rho :: Integral b => b -> [b] 

如果我這樣定義

fun x = ((flip mod) x).(\a -> a^2-1) 

函數的類型是

*Main> :t fun 
fun :: Integral c => c -> c -> c 

我的問題是,如何才能哈斯克爾演繹函數類型爲b - > [b]?我們在這個函數中沒有任何[]類型的數據。謝謝!

回答

14

map有以下類型:

map :: (a -> b) -> [a] -> [b] 

因此,我們可以推斷出該類型的參數map

(((flip mod) x).(\a -> a^2-1)) :: (a -> b) 
(rho x) :: [a] 

map結果也是rho x的結果,所以:

(rho x) :: [b] 

這意味着ab是同一類型,所以:

rho :: ? -> [b] 

如果我們檢查映射功能,使x免費,我們發現類型:

\x -> ((flip mod) x).(\a -> a^2-1) :: Integral b => b -> (b -> b) 

Integral b => b給我們類型爲x(b -> b)與函數組合的類型相結合,所以我們知道這個b與前一個相同。

rho :: Integral b => b -> [b] 
6

(rho x)必須返回一個列表,因爲它被傳遞給map,並且列表元素的類型可以從映射中正在發生的事情推導出來。

相關問題