2013-09-29 3 views
1

하스켈을 처음 사용했지만 : 연산자를 사용하여 문자열 목록에 문자열을 추가하려고했지만 어쨌든 제대로 작동하지 않습니다 ...haskell이 목록에 항목을 추가하지 않습니다.

sl:(printH header):sl:(map printR t) 

하지만이 같은뿐만 아니라 끝에 문자열 sl를 추가하려고하면

sl:(printH header):sl:(map printR t):sl 

는 다른 sincwe 나에게 어떤 이해가되지 않는 오류를, (밖으로 던져 조인이 잘 됐음) :

Couldn't match type '[Char]' with 'Char' 
Expected type: [String] -> Char 
    Actual type: [String] -> String 
In the first argument of 'map', namely 'printR' 
... 

왜 이런 일이 발생하는지 알고 있습니까?

답변

5
Prelude> :type (:) 
(:) :: a -> [a] -> [a] 

이것은 (:) 기능은 왼쪽과 오른쪽 목록에서 단일 항목을 소요 있음을 알려줍니다 : 당신은 같은 것을 사용해야합니다. 을 감안할 때 : 식 b:c 유형 [t]의 때문에

a :: t 
b :: t 
c :: [t], 

a:b:c는 작동 a:(b:c)로 구문 분석합니다. a 유형 [t]이어야하지만, 실제로 형 t의, 그리고 c 유형 t으로해야하지만, 유형 [t]의 실제로 : 한편, b:c:ac:a가 잘못 입력하기 때문에 작동하지 않습니다 b:(c:a)로 구문 분석합니다. 귀하의 예에서 tChar입니다. 당신이 목록의 마지막에 단일 항목을 추가하려면

, 당신은 연결하여 사용할 수 있습니다 (++) :

xs ++ [i]

3

조작 :앞에 추가리스트에 요소로 사용된다. 네 번째 (map printR t가)에 그 앞에 추가하는리스트 반면 표현식에서

sl:(printH header):sl:(map printR t) 

처음 세 식 (sl, printH headersl)은 목록 엘리먼트 (명백하게 스트링)이다.

에 추가하려면 연산자 :을 사용할 수 없습니다.

sl:(printH header):sl:(map printR t) ++ [sl] 
관련 문제