给定长度和索引 - 如何创建“单元”数组?

时间:2012-03-02 13:54:33

标签: haskell

如何创建一个长度为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! 

大脑冻结...任何帮助表示赞赏。

3 个答案:

答案 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)]