[英]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.