Haskell函数组成

时间:2015-06-23 12:22:57

标签: function haskell 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

我一直在键入每一个组合,但它不能用于合成。

有人能照亮我的道路吗?

非常感谢

1 个答案:

答案 0 :(得分:8)

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

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]应用于 SharePhoto photo = new SharePhoto.Builder().setBitmap(shareBitmap).build(); ArrayList<SharePhoto> photos = new ArrayList<>(); photos.add(photo); SharePhotoContent.Builder shareContentBuilder = new SharePhotoContent.Builder(); shareContentBuilder.addPhotos(photos); SharePhotoContent sharePhotoContent = shareContentBuilder.build(); ShareApi.share(sharePhotoContent, new FacebookCallback<Sharer.Result>() { @Override public void onSuccess(Sharer.Result result) { } @Override public void onCancel() { } @Override public void onError(FacebookException e) { } }); 并获得一个函数类型为QueryString的结果(如果你检查GHCi中的类型,你会看到更通用的版本,但我认为这更清楚了)