2013-12-23 3 views
1

Dynamic 데이터 형식을 함수로 입력하고 해당 함수의 구현에 사용하고 싶습니다. 난 getA :: Dynamic -> IO() 할 함수의 특성을 변경하는 경우Haskell 함수의 입력으로 동적 데이터

Could not deduce (b ~ Dynamic) 
from the context (Typeable b) 
    bound by the type signature for getA :: Typeable b => b -> IO() 

때문에 오류가 :

getA :: (Typeable b) => b -> IO() 
getA t = do 
     let v = case fromDynamic t of 
        Nothing -> error "Nao Foi Possível Converter" 
        Just x -> x 
     putStrLn "Ok" 

이 오류 발생이 함수를 가정

No instance for (Typeable a0) arising from a use of `fromDynamic' 
The type variable `a0' is ambiguous 
Possible fix: add a type signature that fixes these type variable(s) 

어떤 데이터 입력해야 이 경우에 사용합니까?

또한 x이 인스턴스 인 클래스에서 함수를 호출 할 수 있습니까? 같은 뭔가 : sayHellox가 인스턴스 인 클래스의 함수이다

case fromDynamic t of 
    Nothing -> error "Nao Foi Possível Converter" 
    Just x -> putStrLn$ sayHello x 

.

답변

6

getA :: Dynamic -> IO()은 올바른 서명입니다. 하지만 실제로는 을 사용해야합니다. 뭔가요! Just x -> x과 간단히 일치하면 컴파일러는이 값을 사용하려는 유형을 알 수 없습니다.

v = case fromDynamic t of 
     Just x -> x + 5 :: Int 

.

3

컴파일러는 실제로 "x"사용이 완전히 다형 적이기 때문에 대/소문자 일치 표현식에서 "x"의 사용법이 모호하다는 것을 알려주고 있습니다. 유형 검사기는 값을 추론 할 수 없습니다. 아무것도.

예를 들어 추출 된 값을 인쇄하려면 String 값이 putStrLn 문에서 이라는 조건을 충족하고 올바르게 컴파일 될 것으로 기대할 수 있습니다.

import Data.Typeable 
import Data.Dynamic 

getA :: Dynamic -> IO() 
getA t = do 
    case fromDynamic t of 
    Nothing -> error "Nao Foi Possível Converter" 
    Just (x :: String) -> putStrLn x 
    putStrLn "Ok" 
관련 문제