不幸的是,我已经尝试了很多,但无法实现此功能。
f5 ::(要么a b-> c)->(a-> c,b-> c)
我尝试过
f5 k _ (Left x) = k x
f5 _ u (Right y) = u y
谢谢您的帮助。
答案 0 :(得分:7)
您实现了
f5 :: (a -> c) -> (b -> c) -> Either a b -> c
您需要执行相反的操作。
f5 :: (Either a b -> c) -> (a -> c, b -> c)
f5 f = (f . Left, f . Right)
答案 1 :(得分:3)
让类型成为您的指南。
您的函数应采用一个参数,即Either a b -> c
类型的函数,并产生一对函数(a -> c, b -> c)
。
(您编写的函数需要三个参数,而不会产生一对。)
也就是说,你想要
f5 f = (a_to_c, b_to_c)
其中f :: Either a b -> c
,a_to_c :: a -> c
和b_to_c :: b -> c
。
要创建a_to_c
,请假定您有一个a
和一个函数Either a b -> c
。
现在,(仅有)一种方法可以从这两件事中创建类型为a -> c
的函数–用Either
从a
创建Left
,然后将其传递到“ Either
函数”。
非正式地,
a_to_c x = f (Left x)
或
a_to_c = f . Left
对于b
的相同推理会导致与b
类似的情况。
b_to_c x = f (Right x)
或
b_to_c = f . Right
将它们放在一起
f5 f = (f . Left, f . Right)
或更详细地说
f5 f = (\x -> f (Left x), \x -> f (Right x))