2017-10-25 19 views
0

私はリストの理解度を使って0のリストを構築しようとしています。しかし、私はまた、私がリストで選択するインデックス1を作りたいと思っています。例えば、myList 5 2 = [0,1,0,0,0]ここで、5は要素の数であり、2はインデックスです。リストの理解に条件を使用するにはどうすればよいですか?

myList el index = [0 | n <- [1..el], if n == index then 1 else 0] 

しかし、これはエラーになります。それがで何が|を残していること

myList el index = [if n == index then 1 else 0 | n <- [1..el]] 

ノートで修正されてい

+1

あなたのリストの理解の先頭に「0」が何をしているのか説明できますか? –

+1

リスト内包表記でない場合、 '[1..el] >> = returnのようなモナド的な方法で行うこともできます。ブール0 1。 (インデックス==) ' – Redu

答えて

4

最小の変更は、リスト要素を生成するものです。 [ 0 | ...]という形式のリストの理解は、ゼロのみを生成し、...部分は、結果のリストの長さを決定するだけです。 |ので我々は発電機(例えばn <- someList)、条件(例えばx > 23)、または新しい定義(let y = ...)のみを許可するため、さらに

は、あなたのコードでは、コンパイラは文句を言います。あなたのコードでは、if ...は条件と解釈され、そのためにブール値に評価されるべきですが、then 1は結果を数値にして、タイプエラーを引き起こします。

別の解決策は、replicate m 0mゼロ、及び++連結し持つリストを生成

myList el index = replicate (index-1) 0 ++ [1] ++ replicate (el-index) 0 

とすることができます。

最後に、indexは1ベースであることに注意してください。多くのプログラミング言語では、0ベースの索引付けが頻繁に使用されるため、これは従来とは異なります。

+0

それは面白いですが、私はそれを見て考えたことはありません。ありがとう! –

+0

[*最小*](https://en.wikipedia.org/wiki/Levenshtein_distance)の変更はおそらく '[x | n < - [1..el]、x < - [if n == index then 1 else 0]] 'である。 :) –

+1

@WillNessTouché! – chi

関連する問題