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
나는 그것이 생성 된 목록에서 문자열과 다른 유형을 갖는 더미 "Found"값과 관련이 있다고 생각하지만 확실하지 않습니다.
해결책
나는 당신의 명시적인 유형의 선언이 잘못되었다고 생각합니다. 당신은 :
lookup :: String -> [(String,String)] -> String
그러나 나는 그것이되어야한다고 생각합니다
lookup :: String -> String -> [(String,String)] -> String
실제로, 다시 한 번 살펴본 후에는 두 번째 매개 변수 "y"를 사용하지 않는 것 같습니다. 그래서 당신은 그것을 제거 할 수 있고
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)])
이렇게하면 유형 선언을 유지할 수 있습니다.
다른 팁
그건 그렇고, Haskell Prelude가 이미 협회 목록에서 항목을 찾을 수있는 "조회"기능이 있다는 것을 알고 있습니까? 다음은 유형 서명입니다 (Eq를 인스턴스하는 주요 유형을 수락하는 것이 더 일반적입니다).
lookup :: (Eq a) => a -> [(a,b)] -> Maybe b
따라서 귀하의 기능은 아래와 같은 것을 달성합니다
myLookup x zs = Maybe.fromMaybe "Not found" $ lookup x zs
한눈에, 두 번째 매개 변수를 제거해야 할 것 같습니다 ( 'y'및 두 번째 밑줄)? 조회는 3 개가 아닌 두 개의 매개 변수를 가져 오라고 선언합니다.
제휴하지 않습니다 StackOverflow