作为Haskell函数输入的动态数据

作为Haskell函数输入的动态数据,haskell,Haskell,我想获得一个动态数据类型作为函数的输入,并将其用于此类函数的实现。 假设此函数: getA :: (Typeable b) => b -> IO () getA t = do let v = case fromDynamic t of Nothing -> error "Nao Foi Possível Converter" Just x -> x putStr

我想获得一个
动态
数据类型作为函数的输入,并将其用于此类函数的实现。 假设此函数:

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"
出现以下错误:

Could not deduce (b ~ Dynamic)
from the context (Typeable b)
  bound by the type signature for getA :: Typeable b => b -> IO ()
如果我将函数的签名更改为
getA::Dynamic->IO()
,那么错误是:

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
为实例的类调用函数?比如:

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

,其中,
sayHello
是类的函数,而
x
是实例。

getA::Dynamic->IO()
是正确的签名。但你真的需要用它做点什么!如果只匹配
Just x->x
,则编译器不知道要使用该值的类型

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

应该有效。

getA::Dynamic->IO()
是正确的签名。但你真的需要用它做点什么!如果只匹配
Just x->x
,则编译器不知道要使用该值的类型

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

应该可以工作。

编译器实际上是在准确地告诉您出了什么问题,在大小写匹配表达式中使用“x”是不明确的,因为您使用的“x”是完全多态的,类型检查器无法推断值,因为它可能是任何东西

例如,如果您想打印出提取的值,您希望该值是一个
字符串
,其中
putStrLn
语句将见证
(x~String)
的约束并正确编译

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"

编译器实际上是在确切地告诉您出了什么问题,“x”在case match表达式中的用法是不明确的,因为您使用的“x”是完全多态的,类型检查器无法推断该值,因为它可能是任何东西

例如,如果您想打印出提取的值,您希望该值是一个
字符串
,其中
putStrLn
语句将见证
(x~String)
的约束并正确编译

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"