我已经定义了一个函数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
我一直在键入每一个组合,但它不能用于合成。
有人能照亮我的道路吗?
非常感谢
答案 0 :(得分:8)
好的,让我们看一下类型(它就像一个谜题 - 类型必须适合):
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]
应用于 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中的类型,你会看到更通用的版本,但我认为这更清楚了)