我正在@evansb查看CIS 194解决家庭作业问题的方法。基本上,问题要求将列表中的所有其他元素加倍,Evan的解决方案就是:
-- 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
对应于该索引处的实际元素?
答案 0 :(得分:5)
[(1::Integer)..]
是从1开始的所有整数的列表。::Integer
指定类型。
对于您的其余问题:[(1::Integer)..]
中的元素将成为x
的值。调用函数doubleEveryOther
的列表将提供y
的值。所以第一个列表基本上只用作基于1的索引。