簡體   English   中英

在函數式編程中確定函數的類型

[英]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, cd 在右側,出現(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 ,可能更多關於ab如下。 實際上, 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必須是與vi相同類型的元素列表,所以v :: ai :: [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中給出xyy必須是函數[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM