Haskell : 첫 번째 값을 기준으로 목록에서 튜플의 두 번째 값을 찾는 것

StackOverflow https://stackoverflow.com/questions/815086

  •  03-07-2019
  •  | 
  •  

문제

여기에는 튜플 목록을 살펴보고 첫 번째 값을 가져 와서 튜플에서 두 번째 값을 찾는 기능이 있습니다. 지금까지 기능은 다음과 같습니다.

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 개가 아닌 두 개의 매개 변수를 가져 오라고 선언합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top