Haskell 功能组合

Haskell function composition

我定义了一个函数f1和f2,这样我就可以在和函数组合(fkomp)中使用,它应该使用f1和f2来计算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]) 两者都无法正常工作(如您所见)。

但是你有点能力应用f1f2作为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 中的类型,你会看到一个更通用的版本,但我认为这更清楚一点)