我需要为以下函数编写一个定义:
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)?
答案 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的值。