Haskell中的索引列表元素
我在看一个学生解决家庭作业问题的方法。基本上,这个问题要求列表中的其他元素加倍,Evan的解决方案是:Haskell中的索引列表元素,haskell,Haskell,我在看一个学生解决家庭作业问题的方法。基本上,这个问题要求列表中的其他元素加倍,Evan的解决方案是: -- Exercise 3 ----------------------------------------- -- Double every second number in a list starting on the left. doubleEveryOther :: [Integer] -> [Integer] doubleEveryOther = zipWith (\x
-- Exercise 3 -----------------------------------------
-- Double every second number in a list starting on the left.
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther = zipWith
(\x y -> if x `mod` 2 == 0 then y * 2 else y) [(1::Integer)..]
我对(1::Integer)
有点困惑,1
是否引用了第一个索引?因此,在lambda函数中,x
对应于索引,y
对应于该索引处的实际元素?[(1::Integer)…]
是从1开始的所有整数的列表。::Integer
指定类型
接下来的问题是:[(1::Integer)]
中的元素将成为x
的值。调用函数doubleEveryOther
的列表将提供y
的值。因此,第一个列表基本上只是用作基于1的索引。[(1::Integer)]
是从1开始的所有整数的列表。::Integer
指定类型
接下来的问题是:
[(1::Integer)]
中的元素将成为x
的值。调用函数doubleEveryOther
的列表将提供y
的值。因此,第一个列表基本上只是用作基于1的索引。谢谢。是否必须指定类型(整数)?@user245954否,不必指定。mod
函数帮助编译器推断此处的类型:mod:(积分a)=>a->a->a
。换言之,不管你把什么类型的类型放在那里,只要它是整数,但是这个约束已经被zipWith
@Undreren传递的函数强制执行了,我不同意。mod
的类型没有明确定义1
的类型,因此如果没有注释,GHC必须应用一个默认值,它可能不同于Integer
@chi,但这并不重要。没有它,它在GHCi运行良好。在写评论之前我已经测试过了。谢谢。是否必须指定类型(整数)?@user245954否,不必指定。mod
函数帮助编译器推断此处的类型:mod:(积分a)=>a->a->a
。换言之,不管你把什么类型的类型放在那里,只要它是整数,但是这个约束已经被zipWith
@Undreren传递的函数强制执行了,我不同意。mod
的类型没有明确定义1
的类型,因此如果没有注释,GHC必须应用一个默认值,它可能不同于Integer
@chi,但这并不重要。没有它,它在GHCi运行良好。我在写评论之前测试了它。仅供参考,zipWith($)(cycle[(2*),id])
也可以工作,而且可能更高效(不需要计算mod
)。仅供参考,zipWith($)(cycle[(2*),id])
也可以工作,而且可能更高效(不需要计算mod
)。