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