作为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"