Function Haskell--尝试使我的foldl函数工作
我有一个将[a,b,c,d,…]转换为[(a,b),(c,d),…]的函数。现在,这是可行的,下面是代码:Function Haskell--尝试使我的foldl函数工作,function,haskell,lambda,tuples,foldleft,Function,Haskell,Lambda,Tuples,Foldleft,我有一个将[a,b,c,d,…]转换为[(a,b),(c,d),…]的函数。现在,这是可行的,下面是代码: makeTuple :: [a] -> [(a,a)] makeTuple [] = [] makeTuple [a] = [] makeTuple (x:y:xs) = (x,y): (makeTuple xs) 现在我要做的下一件事是:使用前面的函数,使用foldl和lambda表达式,将每个元组转换为其两个元素的乘积。这就是我所拥有的: productTuple [x] =
makeTuple :: [a] -> [(a,a)]
makeTuple [] = []
makeTuple [a] = []
makeTuple (x:y:xs) = (x,y): (makeTuple xs)
现在我要做的下一件事是:使用前面的函数,使用foldl和lambda表达式,将每个元组转换为其两个元素的乘积。这就是我所拥有的:
productTuple [x] = foldl makeTuple [] [x]
现在我不确定这是否正是人们对我的要求。我不确定是否应该用类型声明之类的东西来创建一个单独的函数。也许有人能告诉我这是不是最好的方法。另外,这段代码不起作用,我不知道为什么,我需要这部分的帮助。(注意,上面说要使用lambda,但我不知道如何真正正确地使用它们,这是我需要帮助的另一部分)我非常感谢,谢谢。练习要求您使用
makeTuple对输入列表进行预处理,然后将其折叠起来
productTuple :: [Int] -> [Int]
productTuple xs = foldl (some lambda) something (makeTuple xs)
这不是最方便的方法,但我想练习的目的是为了它而强制您使用foldl
。lambda函数应该尊重此签名:
[a] -> (b,b) -> [a]
累加器的类型为[a],元组的类型为(b,b)
您可以尝试这样的lambda\acc(a,b)->acc++[a*b]
最后一个函数可能如下所示:
productTuple :: Num a => [a] -> [a]
productTuple xs = foldl (\acc (a, b) -> acc++[a*b]) [] (makeTuple xs)
你有一些
谁说你必须使用makeTuple
函数?你可能必须实现productTuple的空和反两种情况,所以productTuple(x:xs)
和productTuple[]
。提示:你如何使用接受列表作为输入的foldl
来重新创建该列表(基本上是一个id
函数)?相关:使用OP的makeTuple
会导致类型错误:它只接受一个列表作为参数。