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获取返回值_Haskell - Fatal编程技术网

从另一个函数Haskell获取返回值

从另一个函数Haskell获取返回值,haskell,Haskell,我试图从这个函数中获取值,所以,当我调用这个函数“prompt”时,我会发送一条消息,这个函数返回一个与我提出的假设问题一致的值 但我不能接受那个值,为什么? 我和哈斯克尔在一起 module Main (main) where import System.IO (stdout, hSetBuffering, BufferMode(NoBuffering)) type State = Double main::IO() prompt::Read a => String -> I

我试图从这个函数中获取值,所以,当我调用这个函数“prompt”时,我会发送一条消息,这个函数返回一个与我提出的假设问题一致的值

但我不能接受那个值,为什么? 我和哈斯克尔在一起

module Main (main) where
import System.IO (stdout, hSetBuffering, BufferMode(NoBuffering))
type State = Double

main::IO()
prompt::Read a =>  String ->  IO a


main = do putStrLn "Testing"
          v <- prompt "Whats your name?"
          return ()

prompt str = do putStrLn str
                valor <- readLn
                return valor
主模块(Main),其中
导入System.IO(标准输出、hSetBuffering、缓冲模式(无缓冲))
类型状态=双
main::IO()
提示符::读取a=>String->IO a
main=执行putStrLn“测试”

我相信你的问题只限于你的打字签名

prompt :: Read a => String -> IO a
此类型签名表示,
prompt
是一个函数,它接受一个字符串,执行一些I/O魔术,然后为用户希望的任何可读类型
a
返回类型为
a
的值。但是,您的实现从用户那里获取一个字符串并返回它

如果您希望
提示符
返回字符串,只需更改类型即可

prompt :: Read a => String -> IO a
如果您的真正意图是
提示符
返回某个用户指定类型的值,那么您需要在实际读取该值时解决歧义

prompt :: Read a => String -> IO a
prompt str = do putStrLn str
                valor <- readLn
                return valor
(或者,对于整数,
IO Int
,对于Double,
IO Double
或任何其他可读类型)


但是,您很可能希望
提示符
始终返回字符串。因此,我推荐第一种解决方案,因为它对用户来说更直观。

大概,您希望
v
类型为
String
,但编译器无法知道这一点。
read valor
步骤是多余的
readLn
已经有了类型
Read a=>IO a
@4castle我今天学到了一些东西。我想除了字符串之外,我从来没有使用过
readLn
。谢谢你的更正!:)也许您正在考虑
getLine
?它确实有类型
IO字符串
v <- prompt "Whats your name?" :: IO String