带有列表

时间:2017-01-20 11:25:54

标签: haskell

我想创建一个接收三个列表的函数:第一个是二进制函数列表,第二个和第三个是一元函数列表。 结果必须如下:

 \x y -> f (g x) (h y)

这是我做过的测试......

composeF xa xb xc = [a . (b c) | a <- xa, b <- xb, c <- xc]

...但我不知道如何正确地组成这些功能。

1 个答案:

答案 0 :(得分:7)

你可以简单地在列表理解的头部中放置一个lambda表达式:

composeF fs gs hs = [ \x y -> f (g x) (h y) | f <- fs, g <- gs, h <- hs]

我还冒昧地将给定的列表重命名为fsgshs,因为这些通常是为函数保留的名称(但显然{{1}没有错}},asbs,您只需向读者提供有关您要处理的对象类型的提示。在这种情况下,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个元素。