Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell IO字符串和IO数据类型_Haskell - Fatal编程技术网

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