簡體   English   中英

Haskell函數組成

[英]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必須適合;)

因此,對於您的f1f2您將需要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.

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