2017-10-25 3 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] 

그러나이 경우 오류가 발생합니다.

+1

'0'이 당신의 목록 이해의 머리에서하고있는 것을 설명 할 수 있습니까? –

+1

리스트 comprehensions이 아니라면'[1..el] >> = return 같은 모다드 방식으로 할 수 있습니다. bool 0 1. (인덱스 ==)' – Redu

답변

4

그 해결 작은 변화는 에서 무엇을 |의리스트 요소를 생성 무엇 남긴

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

주이다. [ 0 | ...] 형식의 목록 이해는 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

[* smallest *] (https://en.wikipedia.org/wiki/Levenshtein_distance) 변경은 아마도'[x | n <- [1..el], x <- [if n == 색인 then 1 else 0]]'. :) –

+1

@WillNess Touché! – chi