繁体   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