[英]Haskell function composition
我定義了一個函數f1和f2,以便可以在和函數組合( fkomp
)上使用它,應該使用f1和f2來計算給定List中的每個元素2^x
。
f1 :: Int -> Int
f1 x = product (replicate x 2)
f2 :: (a -> b) -> [a] -> [b]
f2 f xs = [f x | x <- xs]
fkomp :: [Int] -> [Int]
fkomp xs = f2 f1 $ xs
它可以工作,但是問題是我無法編寫具有組成部分的代碼:
fkomp xs = f2.f1 $ xs
我一直在輸入每種組合,但不適用於合成。
有人可以照亮我的路嗎?
非常感謝
好的,讓我們看一下類型(就像一個謎題-類型必須適合):
f1 :: Int -> Int
f2 :: (a -> b) -> [a] -> [b] = (a -> b) -> ([a] -> [b])
為了組成兩者,您需要一個共同域與另一個共同域。
這是因為合成具有類型:
(.) :: (b -> c) -> (a -> b) -> a -> c
看到b
必須適合;)
因此,對於您的f1
和f2
您將需要Int ~ (a -> b)
或Int ~ ([a] -> [b])
兩者均無法正常工作(如您所知)。
但是您有能力將 f1
應用於f2
因為f1
恰好適合f2
第一個參數(您也已經看到)-所以我有點困惑為什么您甚至想在這里使用合成。
您的函數有點奇怪-我認為編寫它們的通常方法是
f1 x = 2 ^ x
f2 = map
甚至
fkomp :: [Int] -> [Int]
fkomp = map (2^)
請注意,最后一個不是函數組成,而是(視情況而定)函數應用:我將函數(2^) :: Int -> Int
應用於map :: (Int -> Int) -> [Int] -> [Int]
並得到類型為[Int] -> [Int]
的函數(如果您檢查GHCi中的類型,您將看到一個更通用的版本,但我認為這更加清楚了)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.