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

时间:2018-06-28 20:31:47

标签: haskell

我正在尝试从该函数获取值,因此,当我调用该函数“提示”时,会发送一条消息,并且此函数将根据我提出的假设问题返回一个值。

但是我不能获得那个价值,那为什么呢? 我对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

1 个答案:

答案 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总是返回一个字符串。因此,我建议第一种解决方案,因为它对用户而言将更加直观。

相关问题