[英]What is the type of foldr map in haskell?
我試圖找出折疊地圖的類型,以及你應該如何解決這樣的問題。
我知道個別類型是什么:
foldr :: (a -> b -> b) -> b -> [a] -> b
map :: (a -> b) -> [a] -> [b]
我知道各個函數是如何工作的,但找出類型是我似乎無法解決的問題。
foldr會將一個函數作為第一個參數,這將是整個映射的權利嗎?
我歡迎所有提示,我是Haskell的新手,並試圖學習這些謎題。
作為成分,我們有foldr
和map
。 為避免混淆,讓我們將map
的a
和b
重命名為c
和d
,因為這些(可能)是不同的類型。 所以我們把功能看作:
foldr :: (a -> b -> b) -> b -> [a] -> b
map :: (c -> d) -> [c] -> [d]
或者更詳細:
foldr :: (a -> (b -> b)) -> (b -> ([a] -> b))
map :: (c -> d) -> ([c] -> [d])
由於map
是具有foldr
作為函數的函數應用程序的參數,這意味着map
的類型應該與foldr
的參數類型相同,因此:
a -> (b -> b)
~ (c -> d) -> ([c] -> [d])
----------------------------------
a ~ (c -> d), b ~ [c] ~ [d], c ~ d
因此我們推導出a
與c -> d
類型相同,並且b
與[c]
和[d]
類型相同。 因此我們也知道c ~ d
( c
與d
類型相同)。
foldr map
的類型是foldr
函數的返回類型,但是專門用於我們派生的相等關系,因此:
foldr map :: b -> ([a] -> b)
所以我們用c -> c
替換a
,用[c]
替換b
,因此類型:
foldr map :: [c] -> ([c -> c] -> [c])
或者是一種不那么冗長的形式:
foldr map :: [c] -> [c -> c] -> [c]
注意 :
foldr
的簽名已經推廣到foldr :: Foldable f => (a -> b -> b) -> b -> fa -> b
,但派生類型是類似的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.