[英]Determining the type of a function in Functional Programming
下面的等式是用Miranda語法編寫的,但由於Miranda和Haskell之間的相似性,我希望Haskell程序員應該理解它!
如果定義以下功能:
rc v g i = g (v:i)
rn x = x
rh g = hd (g [])
f [] y = y
f (x:xs) y = f xs (rc x y)
g [] y = y
g (x:xs) y = g xs (x:y)
你如何計算出函數的類型? 我想我理解如何為f,g和rn解決這個問題,但我對部分應用程序部分感到困惑。
將是* - > * ( 或任何東西 - >任何東西,我認為它是 - > Haskell中的一個? )
對於f和g,函數類型是[*] - > * - > * ?
我不確定如何找到rc和rh的類型。 在rc中,g被部分地應用於變量i - 所以我猜這會將i的類型約束為[*]。 rc和g在rc的定義中應用了什么順序? 是否將g應用於i,然后將結果函數用作rc的參數? 或者rc是否采用v,g和i的3個獨立參數? 我真的很困惑..任何幫助將不勝感激! 多謝你們。
抱歉忘了添加hd是列表的標准head函數,定義如下:
hd :: [*] -> *
hd (a:x) = a
hd [] = error "hd []"
該類型是從已知的類型以及定義中如何使用表達式推斷出來的。
讓我們從頂部開始,
rc v g i = g (v : i)
所以rc :: a -> b -> c -> d
我們必須看看有關a, b, c
和d
。 在右側,出現(v : i)
,所以對於v :: a
,我們看到i :: [a]
, c = [a]
。 然后g
應用於v : i
,所以g :: [a] -> d
,總之,
rc :: a -> ([a] -> d) -> [a] -> d
rn x = x
意味着有上參數類型的無約束rn
和它的返回類型是一樣的, rn :: a -> a
。
rh g = hd (g [])
由於rh
的參數g
應用於RHS上的空列表,因此它必須具有類型[a] -> b
,可能更多關於a
或b
如下。 實際上, g []
是RHS上hd
的參數,所以g [] :: [c]
和g :: [a] -> [c]
,因此
rh :: ([a] -> [c]) -> c
下一個
f [] y = y
f (x:xs) y = f xs (rc x y)
第一個參數是一個列表,如果是空的,結果是第二個參數,所以f :: [a] -> b -> b
來自第一個等式。 現在,在第二個等式中,在RHS上, f
的第二個參數是rc xy
,因此rc xy
必須與y
具有相同的類型,我們稱之為b
。 但
rc :: a -> ([a] -> d) -> [a] -> d
,所以b = [a] -> d
。 於是
f :: [a] -> ([a] -> d) -> [a] -> d
最后
g [] y = y
g (x:xs) y = g xs (x:y)
從第一個等式我們推導出g :: [a] -> b -> b
。 從第二個開始,我們推導出b = [a]
,因為我們采用g
的第一個論證的頭部,並將其限制在第二個,因此
g :: [a] -> [a] -> [a]
我將使用haskell語法來編寫類型。
rc v g i = g (v:i)
這里rc
有三個參數,因此它的類型將類似於a -> b -> c -> d
。 v:i
必須是與v
和i
相同類型的元素列表,所以v :: a
和i :: [a]
。 g
應用於該列表,因此g :: [a] -> d
。 如果你把所有在一起,你得到rc :: a -> ([a] -> d) -> [a] -> d
。
你已經想出了rn :: a -> a
,因為它只是身份。
我不知道你在rh
使用的hd
函數的類型,所以我會跳過它。
f [] y = y
f (x:xs) y = f xs (rc x y)
這里f
采用兩個參數,因此它的類型將類似於a -> b -> c
。 從第一種情況我們可以推導出b == c
,因為我們返回y
,並且第一個參數是一個列表。 現在我們知道f :: [a'] -> b -> b
。 在第二種情況下,注意如何在輸入rc
中給出x
和y
: y
必須是函數[a'] -> d
,並且rc xy :: a' -> d
(也必須是y
的類型,因為它作為f
)的第二個參數傳遞。 最后,我們可以說f :: [a'] -> ([a'] -> d) -> ([a'] -> d)
。 由於->
是右關聯的,這相當於[a'] -> ([a'] -> d) -> [a'] -> d
。
您可以以相同的方式推斷其余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.