我想创建一个接收三个列表的函数:第一个是二进制函数列表,第二个和第三个是一元函数列表.结果必须如下:
\x y -> f (g x) (h y)
这是我做过的测试......
composeF xa xb xc = [a . (b c) | a <- xa, b <- xb, c <- xc]
...但我不知道如何正确地组成这些功能.
那么你可以简单地将lambda表达式放在列表理解的头部:
composeF fs gs hs = [ \x y -> f (g x) (h y) | f <- fs, g <- gs, h <- hs]
我也冒昧地将给定的列表重命名为fs
,gs
并且hs
因为这些通常是为函数保留的名称(但显然没有任何问题as
,bs
并且cs
,您只给读者一个关于您想要处理的对象类型的提示).在那种情况下composeF
有类型:
composeF :: [t1 -> t2 -> t] -> [t3 -> t1] -> [t4 -> t2] -> [t3 -> t4 -> t]
这似乎是所要求的类型.
你可以在语法上将lambda表达式进一步缩短为:
\x -> f (g x) . h
所以:
composeF fs gs hs = [ \x -> f (g x) . h | f <- fs, g <- gs, h <- hs]
请注意,您将为每个组合构造一个函数,因此给定fs
长度为3,gs
长度为5且hs
长度为8,生成的列表将具有3×5×8 = 120个元素.