2012-03-02 10 views
0

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! 

は、脳の凍結...感謝任意の助けを持ちます。

+2

部分的な関数の実行時例外を使用することは、一般的に非慣習的なHaskell( 'Prelude.head'にもかかわらず)とみなされます。タイプを 'unitList :: Int - > Int - > Maybe [Double]'に変更することを検討するかもしれません。 –

+0

良いアイデア、ありがとう! – drozzy

答えて

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)があるため、データ型の名前を混同しないでください。

+0

ヤップ、私はリストを意味した。ごめんなさい。あなたのコードはIntsを生成しませんか?あなたは0と1と0.0と1.0とを使用します。 – drozzy

+0

コードは、何らかの 'Num'型が型シグニチャに含まれます。整数リテラルは '1 :: Num a => a'型で、' fromInteger integer_with_literal_value'のために 'Double'が必要な場合は' 1'が 'Double'になり、別の型が必要な場合は'それがあります。 –

1

リストを作成するには、範囲構文を使用してインデックスのリストを作成し、mapを呼び出してインデックスを参照し、各インデックスをユーザーが指定したインデックスと比較します1.0または0.0にそれに応じて。それはリスト、ない配列だと

0
foo n k | n < 0 || n >= k = error "not in range" 
     | otherwise = map (fromIntegral.fromEnum.(==k))[0..(n-1)] 
関連する問題