Haskell函数组成

Vuc*_*ena 1 haskell function composition

我已经定义了一个函数f1和f2,因此我可以使用函数composition(fkomp),它应该使用f1和f2来计算2^x给定List中的每个元素.

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 
Run Code Online (Sandbox Code Playgroud)

它的工作原理,但问题是,我无法用组合编写我的代码:

fkomp xs = f2.f1 $ xs
Run Code Online (Sandbox Code Playgroud)

我一直在键入每一个组合,但它不适用于组合.

有人可以减轻我的道路吗?

非常感谢

Car*_*ten 8

好吧,让我们看看类型(它就像一个谜题 - 类型必须适合):

f1 :: Int -> Int
f2 :: (a -> b) -> [a] -> [b] = (a -> b) -> ([a] -> [b])
Run Code Online (Sandbox Code Playgroud)

为了组合你需要的两个共域与其他域相同.

这是因为组合物有类型:

(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)

看到b必须适合;)

所以对你来说f1,f2你需要其中一个Int ~ (a -> b)Int ~ ([a] -> [b])两个都不能正常工作(如你所知).

你种得能力适用 f1f2作为f1刚刚符合f2第一个参数(如你所看到的太) -所以我有点困惑,为什么你甚至想在这里用的组合物.

备注

你的功能有点奇怪 - 我认为写它们的通常方法是

f1 x = 2 ^ x
f2 = map
Run Code Online (Sandbox Code Playgroud)

甚至

fkomp :: [Int] -> [Int]
fkomp = map (2^)
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个不是函数组合,而是(就像你的情况一样)函数应用程序:我将函数(2^) :: Int -> Int应用于map :: (Int -> Int) -> [Int] -> [Int]并获得类型函数[Int] -> [Int]作为结果(如果你检查GHCi中的类型,你会看到更通用的版本但我觉得这有点清楚了)