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
必须适合 ;)
因此,对于您的 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 中的类型,你会看到一个更通用的版本,但我认为这更清楚一点)
我定义了一个函数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
必须适合 ;)
因此,对于您的 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 中的类型,你会看到一个更通用的版本,但我认为这更清楚一点)