如何实现此Haskell功能?

时间:2018-11-19 13:52:33

标签: haskell

不幸的是,我已经尝试了很多,但无法实现此功能。

  

f5 ::(要么a b-> c)->(a-> c,b-> c)

我尝试过

f5 k _ (Left x)     =  k x
f5 _ u (Right y)    =  u y

谢谢您的帮助。

2 个答案:

答案 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 -> ca_to_c :: a -> cb_to_c :: b -> c

要创建a_to_c,请假定您有一个a和一个函数Either a b -> c
现在,(仅有)一种方法可以从这两件事中创建类型为a -> c的函数–用Eithera创建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))