2016-09-11 3 views
1

저는 하스켈 세계에서 아주 새롭습니다. 온라인 http://learnyouahaskell.com을 읽고 있었지만 패턴 일치 섹션에 대한 세부 정보를 이해할 수 없었습니다. 나는 그패턴 x : 문자열이있는 xs

myFunc' (firstLetter:_) = "Hello" ++firstLetter 

그런 짓을하면 내가이 기능을

Couldn't match type ‘Char’ with ‘[Char]’ 
     Expected type: [[Char]] 
     Actual type: [Char] 

를 호출 할 때 나에게 오류를 다음 제공하는 기능

그러나
myFunc' (firstLetter:_) = firstLetter -- returns firstLetter of given string 

를 작성하지만 한이 같은 기능을 수정하는 경우

myFunc' (firstLetter:_) = "Hello" ++ [firstLetter] 

이 함수를 호출하면 잘 작동합니다. 다른 경우에는 대괄호가 필요한 이유가 궁금합니다. 실제로 firstLetter 무엇입니까?

답변

4

첫째, 당신이 얻을 : 그것은 인수 등의 두 가지 목록을 소요 의미

Prelude> :t (++) 
(++) :: [a] -> [a] -> [a] 

합니다.

은 마찬가지로의가 (:)이 무엇을 보자 :
Prelude> :t (:) 
(:) :: a -> [a] -> [a] 

그래서 (:)의 첫 번째 인수가 전혀리스트가 될 필요는 없다. a == Char을 수정하면 실제로는 (:) :: Char -> String -> String이됩니다.

우리는 기능 headStr (리콜 String == [Char])를 정의 할 수 있습니다

headStr :: String -> Char 
headStr (x:_) = x 
headStr _ = error "Empty string!" 

참고 인해이 경우 x :: Char(:)의 종류.

hello :: String -> String 
hello (x:_) = "Hello" ++ x 
hello _ = error "Empty string!" 

그것 때문에 우리가 [Char] ++ Char을 얻을 비 오류시 확인 입력하지 않습니다 한편

우리는 정의하려고합니다.ghci가 도움이 되었기 때문에 (++)의 두 번째 인수는 항상 목록이어야하며이 경우 첫 번째 인수는 [Char]이기 때문에 [Char]이어야합니다.

hello' :: String -> String 
hello' (x:_) = "Hello" ++ [x] 
hello' _ = error "Empty string!" 

예상대로이 작동합니다 : 당신이 자신을 발견으로

는이 목록에 x 포장 해결할 수 있습니다.

4
"Hello ++ firstLetter 

유형이있다 : 당신이 볼 수 있듯이,이 방법을 사용할 수없는

[Char] ++ Char 

. [Char]Char을 추가 할 수 없습니다. 다른 유형입니다.

하지만 1 개 요소, firstLetter와 목록을 작성하는

[firstLetter] 

수행하여

. firstLetterChar이므로 Char의 목록이 표시됩니다. 목록의 유형은 [Char]입니다.

같은 유형의 목록 2 개를 추가 할 수 있으므로 두 번째 경우에서 작동합니다. 당신이 ghci에서 (++)의 종류를 확인하는 경우

+0

안녕하세요 Rakete1111, 의견을 보내 주셔서 감사합니다. 한 가지 더 확인하기 위해 작은 실험을했습니다. char에 [Char]를 추가 할 수 없다고 말씀하셨습니다. 그러나 ghci ('c': "dfg")에서이 줄을 사용하면 유효합니다. 그래서 우리는 (++) 연산자가 같은 타입을 요구한다고 말할 수 있습니다. –

+0

@CanEldem 글쎄, 기술적으로, 예. 'c'의 타입은''dfg '', 즉'Char'에있는 원소의 타입이기 때문에 여러분은 라인이 유효합니다. ' "c": "dfg"'는 유효하지 않습니다. – Rakete1111

관련 문제