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

How do I split the parameters from a received function

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

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

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

f c g = ???

所以在我看来这个函数 g 接收一个 c 而 returns 一个函数接收一个 a 并且 returns 接收一个 b。它可能是一个接收 c 和 a 以及 returns a b 的函数,但是 a 从哪里来?

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

所以我有 c,我可以将其输入 g 并取回函数 (a->b)。我如何拆分它们以便 return 元组 (a, [a]) 和 ([b], b)?

实现是

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

谢谢@Bergi。

首先,a、b 和 c 是类型而不是值,例如函数 id(它接收一个参数并且 returns 它没有做任何改变 Ex:id 4 是 4 ) 具有类型签名:

id :: c -> c

也就是说它接收了一个c类型的参数,return接收了一个c类型的值。 那么,下面的类型签名是什么意思?

func :: a -> b -> b

表示func接收两个参数,一个是a类型,一个是b类型,return是一个b类型的值,因为只有最后一个类型是return 类型。 如果你想要一个 return 的函数,它看起来像这样:

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

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

类型的值