如何从接收的函数中拆分参数

时间:2017-04-25 16:36:54

标签: haskell functional-programming currying

我需要为以下函数编写一个定义:

f :: c -> (c -> a -> b) -> (a, [a]) -> ([b], b)

接收元素c和函数g(即(c-> a-> b))。

f c g = ???

所以在我看来,这个函数g接收一个c并返回一个接收a并返回b的函数。它可以是一个函数,它接收一个c和一个a并返回一个b,但那么a将来自哪里?

f :: c -> (c -> (a -> b)) -> (a, [a]) -> ([b], b)

所以我有c可以输入g并返回功能(a-> b)。如何拆分它们以返回元组(a,[a])和([b],b)?

2 个答案:

答案 0 :(得分:0)

实施

f c g = \(x, xs) -> (map (g c) xs, (g c) x)

谢谢,@ Bergi。

答案 1 :(得分:-1)

首先,a,b和c是不是值的类型,例如函数id(接收参数并返回它而不进行任何更改Ex:id 4是4)具有类型签名:< / p>

id :: c -> c

这意味着它接收类型为c的参数并返回类型c的值。 那么,以下类型签名是什么意思?

func :: a -> b -> b

这意味着func接收两个参数,一个是类型a,一个是类型b,并返回类型为b的值,因为只有最后一个类型是返回类型。 如果你想要一个返回函数的函数,它将看起来像这样:

func2 :: a -> (b-> b)

func2获取类型a的值并返回一个函数,它转向类型为b的值并返回类型为b的值。 所以f(f :: c -> (c -> (a -> b)) -> (a, [a]) -> ([b], b))的类型签名向我们表明f有三个参数:一个是c类型,一个是一个函数,它接受一个类型c值并返回一个函数,该函数又接受一个类型为a的值并返回一个类型为b的值,另一个是元组(在本例中为一对​​),由一个类型为a的值和一个类型为a的值列表组成,最后返回一个由一系列值组成的元组。类型b和类型b的值。 此外,[a]表示类型值列表,(a1,a2....an)是元组(有点像固定大小的列表),(a,b)具体是由a和a类型的值组成的对类型为b的值。