Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中列表的前三项_Haskell - Fatal编程技术网

Haskell中列表的前三项

Haskell中列表的前三项,haskell,Haskell,我是Haskell的新手,在函数方面有点困难。前提很简单:运行一个列表,并用另一个函数将相邻的3个项组合起来,然后返回一个包含结果的列表。问题是要用一种好的方式去做 以下是我得到的: foo::[Int]->[Int] foo-xs |长度xsInt->Int->Int 计算x y z=x+y-(z*2) --我们可以这样使用它: foo[1,2,3]-[-3] foo[1,2,3,4]-[-3,-3] foo[1,1,5,3,3]-[-8,0,2] 我不喜欢的是第五行,包含所有的。我觉得我的

我是Haskell的新手,在函数方面有点困难。前提很简单:运行一个列表,并用另一个函数将相邻的3个项组合起来,然后返回一个包含结果的列表。问题是要用一种好的方式去做

以下是我得到的:

foo::[Int]->[Int]
foo-xs
|长度xs<3=[]
|否则=n:foo(尾部xs)
其中n=calc(xs!!0)(xs!!1)(xs!!2)
--这个函数实际上要复杂得多。
计算:Int->Int->Int->Int
计算x y z=x+y-(z*2)
--我们可以这样使用它:
foo[1,2,3]-[-3]
foo[1,2,3,4]-[-3,-3]
foo[1,1,5,3,3]-[-8,0,2]
我不喜欢的是第五行,包含所有的
。我觉得我的想法是错误的,应该有更好的方法。我想做点像

foo(x:y:z:xs)
-- ...
但当列表中的项目少于三项时,这将失败。那么,当列表中的项目较少时,我必须声明其他模式

另外,如果已经有一个函数可以做
foo
所做的事情(可能有,似乎每件事都有一个),那么我并不是真的对它感兴趣。我试图探索哈斯克尔的做事方式,而不仅仅是扩展我的功能

编辑:在JS中,我会执行类似于
n=calc.apply(null,take(3,xs))
的操作。我想知道Haskell是否有类似于
apply
的东西,它接受数组并将其作为参数应用于函数

编辑2--解决方案:(基于下面的评论)

最后一个模式匹配是一个包罗万象的匹配,因此如果第一个“失败”,它将失败并返回一个空列表。

那么,
foo(x:y:z:xs)
加上一个“太短子句”肯定不是一个好的解决方案。另一个是

foo xs = case splitAt 3 xs of
           ([x,y,z],xs') -> calc x y z : foo (y:z:xs')
           _ -> []
或者,也许是最好的

import Data.List (tails)

foo xs = [ calc x y z | (x:y:z:_) <- tails xs ]
导入数据列表(尾部)

foo-xs=[calc x y z |(x:y:z:|)您确实应该只在
foo(x:y:z:xs)
上进行模式匹配,并为其他所有
foo\u=[]
。检查列表的长度以确定一定数量的元素的存在不是惯用的方法。什么?我能做到?一秒…如此…平滑。我想我可能喜欢这种语言。
xs'
只是另一个变量名,对吗?
没有什么特别之处。但是,你不是用列表调用
calc
Casper我相信“Haskell中的约定是,就像在数学中一样,变量名上的撇号表示与先前变量相关或类似的变量。”适用于此处。是的,
xs'
只是另一个变量名。是的,我用列表调用
calc
,没有正确读取问题中的签名。对,我就是这么想的。@leftaroundabout:这似乎不起作用。我用
[1,1,5,3,3]调用它时得到了
[-8]
再次没有正确阅读问题…您必须将
y
z
传递给递归调用。
import Data.List (tails)

foo xs = [ calc x y z | (x:y:z:_) <- tails xs ]