2013-08-10 1 views
4

하스켈을 처음 사용하고 목록을 가져 와서 bool을 반환하는 함수를 작성하려고합니다.하스켈에서 함수가 'a'로 구성된 목록이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

입력 목록이 'a'만의 목록이고 그렇지 않으면 False 인 목록 인 경우 True을 반환합니다.

이 내 추측이다 :

f :: [a] -> Bool 

f ('a':[]) = True 

f (x:xs) = False 

이 컴파일에 실패 반환 :

Couldn't match type `a' with `Char' 
    `a' is a rigid type variable bound by 
     the type signature for f :: [a] -> Bool at charf.hs:6:1 
In the pattern: 'b' 
In the pattern: 'b' : [] 
In an equation for `f': f ('b' : []) = True 

내 논리의 오류가 무엇입니까?

+2

목록에 'Char''a '가 하나만 있어야한다는 것을 의미합니까? 이 경우 함수는'[Char] -> Bool' 타입이어야합니다. 현재 서명은 모든 유형의 목록을 허용하므로 오류가 발생합니다. – Lee

+0

'f x = x == "a", 또는보다 간결하게'f = (== "a")'를 사용할 수 있습니다. – leftaroundabout

답변

7
f :: [Char] -> Bool 
f ['a'] = True 
f _ = False 

패턴 일치를 사용하십시오. 함수가 빈 목록을 처리하지 않는 것 같습니다. 또한 명확하게 [Char] (또는 String)이 필요하므로 원하는대로 함수를 일반화 할 수 없습니다.

+0

[a]는 모든 유형의 목록을 참조합니다. 맞습니까? 따라서 목록을 취하고 첫 번째 요소가 'a'이거나 그렇지 않으면 false 또는 적어도 내 목표였던 경우 true를 반환하는 함수를 정의 할 수 있습니다. – user2666425

+0

명시 적으로'Char'를 사용하고 있기 때문에 그렇게 할 수 없습니다. 알파리스트를 사용하려는 경우 서명의 아무 곳에서나 유형을 지정할 수 없습니다. –

+0

어디에서 명시 적으로 정의 방정식을 제외하고 char를 사용합니까? head = 'a'인 경우 알파 목록을 사용하고 true를 반환 할 수없는 이유는 무엇입니까? – user2666425

1

목록에 주어진 값이 하나라도 들어 있는지 테스트하는 함수를 만들려면 몇 가지 사항을 변경해야합니다.

먼저 비교할 예상 값을 제공해야합니다. 현재 Char 'a'와 비교하려고 시도하지만 Char을 알 수없는 유형 a과 비교할 수 없습니다. 둘째,이 유형은 Eq 클래스의 인스턴스 여야 만 비교할 수 있습니다.

싱글 톤 목록과 패턴 일치를 한 다음 원하는 요소와 비교할 절을 추가 할 수 있습니다.

isSingletonOf :: Eq a => a -> [a] -> Bool 
isSingletonOf v [s] | v == s = True 
isSingletonOf _ _ = False 

그럼 당신은 [Char]을 비교하는 함수를 만들 수 있습니다

f :: [Char] -> Bool 
f = isSingletonOf 'a' 
0

은 또한 그렇게, Data.List에 정의 된 기능 elem을 사용할 수 있습니다. 여기

는 문서 링크입니다 :
http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html#v:elem
에 관한

f :: [Char] -> Bool
f = elem 'a'

(당신이 당신이 행의 끝에서 소스를 클릭 할 수 있습니다 구현하는 방법을보고 싶은 경우) 유형에 관한 귀하의 대답은 map입니다.당신이 말했듯이 :
map :: (a -> b) -> [a] -> [b]

toUpper :: Char -> Char

결과적으로
map toUpper :: [Char] -> [Char]

을 당신은 기능 g :: String -> Int를 정의한다면 다음
map g :: [String] -> [Int]
당신이 볼, 당신이로 줄 기능에 따라 map의 첫 번째 인수는 결과 함수가 입력에 동일한 유형을 가질 수도 있고 그렇지 않을 수도 있습니다 utput.

관련 문제