Haskell IO字符串和IO数据类型
我有这个:Haskell IO字符串和IO数据类型,haskell,Haskell,我有这个: data SomeData = SomeData Int Int getDataFromUser :: SomeData getDataFromUser = do { read (getLine)::SomeData; } 未编译:预期类型字符串实际类型IO字符串 我怎么能修好它?我需要这个数据反序列化…您试图将getLine视为一个字符串,但它是一个IO字符串——一个IO操作,执行时会生成一个字符串。您可以使用执行它并从do块中获取结果值。您试图将getLine视为字符
data SomeData = SomeData Int Int
getDataFromUser :: SomeData
getDataFromUser = do
{
read (getLine)::SomeData;
}
未编译:预期类型字符串实际类型IO字符串
我怎么能修好它?我需要这个数据反序列化…您试图将
getLine
视为一个字符串,但它是一个IO字符串
——一个IO操作,执行时会生成一个字符串。您可以使用执行它并从do
块中获取结果值。您试图将getLine
视为字符串,但它是一个IO字符串
——一个IO操作,在执行时会生成一个字符串。您可以使用执行它并从do
块中获取结果值。您需要阅读更多关于Haskell IO如何工作的信息,并确保您理解它
关于你的例子有几点。如果要使用read
反序列化到SomeData
,则需要为该类型提供一个read
实例。您可以使用默认设置:
data SomeData = SomeData Int Int deriving (Read)
第二:getLine
是一个IO
操作,它返回一个String
,而不是String
;由于read
需要字符串
,因此这就是导致错误的原因。这更接近您想要的:
getDataFromUser :: IO SomeData
getDataFromUser = do str <- getLine
return (read str)
你需要阅读更多关于Haskell IO的工作原理,并确保你理解它
关于你的例子有几点。如果要使用read
反序列化到SomeData
,则需要为该类型提供一个read
实例。您可以使用默认设置:
data SomeData = SomeData Int Int deriving (Read)
第二:getLine
是一个IO
操作,它返回一个String
,而不是String
;由于read
需要字符串
,因此这就是导致错误的原因。这更接近您想要的:
getDataFromUser :: IO SomeData
getDataFromUser = do str <- getLine
return (read str)
下面的答案“更有帮助”,因为它们解决了你的概念问题;但是,您也可能对“不太有用”的修复程序感兴趣,getDataFromUser::iosomedata;getDataFromUser=readLn
。下面的答案“更有帮助”,因为它们解决了您的概念问题;但是,您也可能对“不太有用”的修复程序感兴趣,getDataFromUser::iosomedata;getDataFromUser=readLn
。