如何创建一个长度为n
的数组,全部为零,除了某些索引i
等于1.0?
例如,如果我的魔术函数是foo
,它将按如下方式工作:
foo:: Int -> Int -> [Double]
> foo 3 0
[1.0, 0.0, 0.0]
> foo 2 1
[0.0, 1.0]
> foo 1 1
** Exception: index greater than length!
大脑冻结...任何帮助表示赞赏。
答案 0 :(得分:4)
unitList :: Int -> Int -> [Double]
unitList len index
| index < len = replicate index 0 ++ 1 : replicate (len - 1 - index) 0
| otherwise = error "index out of range"
请注意,这是列表,而不是数组。列表具有O(i)索引,数组O(1),因此不应混淆数据类型的名称。
答案 1 :(得分:1)
要创建列表(作为您的类型签名和示例建议),您可以使用范围语法来创建索引列表,然后调用map
来遍历索引,将每个索引与用户的索引进行比较提供并相应地将其映射到1.0或0.0。
答案 2 :(得分:0)
foo n k | n < 0 || n >= k = error "not in range"
| otherwise = map (fromIntegral.fromEnum.(==k))[0..(n-1)]