[英]Function composition with lists
我想创建一个接收三个列表的函数:第一个是二进制函数的列表,第二个和第三个是一元函数的列表。 结果必须是这样的:
\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个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.