2009-05-02 9 views
3

여기에 튜플 목록을 살펴보고 튜플의 두 번째 값을 찾아내는 함수가 있습니다. 첫 번째 값. 주어진 첫 번째 문자열을 포함하는 어떤 튜플이없는 경우Haskell : 첫 번째 값을 기준으로 목록에서 두 번째 값을 찾으십시오.

lookup :: String -> [(String,String)] -> String 
lookup _ _ [] = "Not found" 
lookup x y zs = if (notFound x zs) 
    then "Not found" 
    else (head [b | (a,b) <- zs, (a==x)]) 

NOTFOUND 기능은 단지 BOOL로 true를 돌려 : 여기에 지금까지 기능입니다. 문제는 내가 포옹에 이러한 유형의 오류 얻을 수 있습니다 :

ERROR "find.hs" (line 22): Type error in explicitly typed binding 
*** Term   : lookup 
*** Type   : String -> [(String,String)] -> [a] -> String 
*** Does not match : String -> [(String,String)] -> String 

나는 그것이 생성 된 목록에서 문자열에 대한 다른 유형을 갖는 더미 "찾을 수 없음"값을 함께 할 수있는 뭔가 생각하고 있어요,하지만 난 확실하지 않다.

답변

6

명시 적 유형 선언이 잘못되었다고 생각합니다. 당신은이 : 당신이 "Y"2 매개 변수를 사용하지 않는 것처럼

lookup :: String -> [(String,String)] -> String 

하지만 난 그게 사실

lookup :: String -> String -> [(String,String)] -> String 

해야한다고 생각, 그것은 또 다른 모습을 촬영 한 후, 그것은 보인다. 그래서 당신이 당신이 가지고있는 유형 선언을 유지 할 수 있도록

lookup :: String -> [(String,String)] -> String 
lookup _ [] = "Not found" 
lookup x zs = if (notFound x zs) 
    then "Not found" 
    else (head [b | (a,b) <- zs, (a==x)]) 

처럼 및 밑줄을 제거 할 수 있습니다.

1

두 번째 매개 변수 ('y'와 두 번째 밑줄)를 제거해야하는 것처럼 보입니다. lookup은 3 개가 아니라 2 개의 매개 변수를 취하도록 선언됩니다.

6

그런데 Haskell Prelude에는 이미 연결 목록의 항목을 조회하는 "조회"기능이 있습니다.

lookup :: (Eq a) => a -> [(a,b)] -> Maybe b 

그래서 당신의 기능은

myLookup x zs = Maybe.fromMaybe "Not found" $ lookup x zs 
아래 같은 작업을 수행합니다 : 여기 유형 서명은 (그것은 어떤 키 유형 인스턴스 식을 받아들이, 더 일반적이다)
관련 문제