我正在尝试从该函数获取值,因此,当我调用该函数“提示”时,会发送一条消息,并且此函数将根据我提出的假设问题返回一个值。
但是我不能获得那个价值,那为什么呢? 我对haskell不满意。
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
答案 0 :(得分:2)
我相信您的问题仅限于您的类型签名。
prompt :: Read a => String -> IO a
此类型签名表示prompt
是一个函数,它接受一个字符串,执行一些I / O魔术操作,然后为 any 返回一个a
类型的值。用户希望的可读类型a
。但是,您的实现会从用户那里获取一个字符串并返回它。
如果您打算prompt
返回一个字符串,只需更改您的类型。
prompt :: Read a => String -> IO a
如果您的意图确实是prompt
返回某个用户指定的任意类型的值,则在实际读取该值时需要解决歧义。
prompt :: Read a => String -> IO a
prompt str = do putStrLn str
valor <- readLn
return valor
您会在main
中得到一个歧义错误,因为Haskell无法确定您想要v
是哪种类型。可以通过明确指定来解决。
v <- prompt "Whats your name?" :: IO String
(或等效地,IO Int
代表整数,IO Double
代表双精度或任何其他可读类型)
但是,您更有可能希望prompt
总是返回一个字符串。因此,我建议第一种解决方案,因为它对用户而言将更加直观。