2017-12-24 35 views
0

map 함수를 이해했는지 확인하기 위해 A-Z 범위의 모든 항목에 'a'문자를 추가하려고했습니다.목록의 모든 항목에 char을 어떻게 추가합니까?

Prelude> map (++ 'A')['A'..'Z'] 

<interactive>:46:9: 
    Couldn't match expected type ‘[a]’ with actual type ‘Char’ 
    Relevant bindings include it :: [[a]] (bound at <interactive>:46:1) 
    In the second argument of ‘(++)’, namely ‘'A'’ 
    In the first argument of ‘map’, namely ‘(++ 'A')’ 
    In the expression: map (++ 'A') ['A' .. 'Z'] 

<interactive>:46:14: 
    Couldn't match expected type ‘[a]’ with actual type ‘Char’ 
    Relevant bindings include it :: [[a]] (bound at <interactive>:46:1) 
    In the expression: 'A' 
    In the second argument of ‘map’, namely ‘['A' .. 'Z']’ 
    In the expression: map (++ 'A') ['A' .. 'Z'] 

<interactive>:46:19: 
    Couldn't match expected type ‘[a]’ with actual type ‘Char’ 
    Relevant bindings include it :: [[a]] (bound at <interactive>:46:1) 
    In the expression: 'Z' 
    In the second argument of ‘map’, namely ‘['A' .. 'Z']’ 
    In the expression: map (++ 'A') ['A' .. 'Z'] 
Prelude> 

이해가 ++ 문자열을 포함 목록에 대한 CONCAT 연산자 : 내가 출력으로 알아 보았 그나마 이러한 예외를 얻을 수 있기 때문에

는 음 appearently 내가 해달라고.

내 코드가 뭐니?

+3

. 아마 당신은 문자열을 사용하기위한 것입니다. 큰 따옴표를 사용하십시오. –

답변

8

++은 목록에 대한 연결 연산자입니다. 목록을 가져와 끝에 다른 목록을 추가합니다 (예 : [1, 2, 3] ++ [4, 5, 6] == [1,2,3,4,5,6]). 귀하의 경우 문제는 캐릭터를 캐릭터에 추가하려고 시도하는 것이지리스트에리스트를 추가하는 것이 아닙니다.

문자열은 문자의 목록입니다, 그래서 대신에 우리가 할 수있는 :

map (\x -> [x] ++ ['A']) ['A'..'Z']

그러나이 조금 복잡하고 추한입니다. 목록 시작 부분에 하나의 항목 만 추가하려는 경우 : 연산자를 사용할 수 있습니다. 이 방법으로 문제를 뒤집을 수 있습니다. 각 문자 끝에 'A'를 추가하는 대신 'A'의 시작 부분에 문자를 추가 할 수 있습니다. 예를 들어

: 당신이, 내가 "A"와 'A'를 대체 한이 나타날 수 있습니다으로

map (: "A") ['A'..'Z']

: 우리는 다음 ETA는이를 줄일 수 있습니다

map (\x -> x : "A") ['A'..'Z']

. "A"는 문자의 목록입니다. 문자는 한 요소 일뿐입니다. 이제 우리는리스트로 변환하지 않고 입력 된 하나의 문자를리스트에 추가 할 수 있습니다.

그리고 우리가 볼 수있는, 그것은 예상대로 작동합니다 : 당신은 문자를 추가 할 수 없습니다

Prelude> map (: "A") ['A'..'Z'] 
["AA","BA","CA","DA","EA","FA","GA","HA","IA","JA","KA","LA","MA","NA","OA","PA","QA","RA","SA","TA","UA","VA","WA","XA","YA","ZA"]