(제 용어가 잘못되어 사과드립니다.) 인라인 유형에 사용되는 유형 변수를 지정하는 방법은 함수 정의에 사용되는 유형 변수와 동일합니까?
나는 예외를 처리하는 래퍼 함수 작성하려고 해요 : 주어진IO
조치가 발생하면, 그것은 (물론의
IO
컨텍스트 내에서)
Nothing
을 반환을하지만, 주어진
IO
작업이 성공하면, 그것은
Just v
를 반환합니다.
tryMaybe :: IO a -> IO (Maybe a)
tryMaybe action = do
result <- (try action) :: IO (Either SomeException a)
return $ case result of
Left _ -> Nothing
Right v -> Just v
이 컴파일러 오류 메시지가 발생합니다
Couldn't match type `a' with `a1'
`a' is a rigid type variable bound by
the type signature for tryMaybe :: IO a -> IO (Maybe a)
at src/Database.hs:33:13
`a1' is a rigid type variable bound by
an expression type signature: IO (Either SomeException a1)
at src/Database.hs:35:15
Expected type: IO a1
Actual type: IO a
In the first argument of `try', namely `action'
내가 첫 번째 줄에서 입력 변수 a
는 세 번째 줄에있는 a
와 동일하지 않습니다 같은데요 - 그들은 단지 소스 코드에서 같은 이름을 가지면 오류 메시지에서 컴파일러가 a1
의 이름을 바꿉니다.
그럼 하스켈에게 이들이 같은 유형이라고 어떻게 말합니까?
'ScopedTypeVariables'을 사용해 보셨나요? – bheklilr
관련 설명 : http://stackoverflow.com/questions/15800878/scoped-type-variables-require-explicit-foralls-why – stusmith