【问题标题】:IO() Recursive Type Matching IssueIO() 递归类型匹配问题
【发布时间】:2022-01-18 01:57:17
【问题描述】:

所以我在考试中遇到了这个问题,我真的不知道如何匹配数据类型。

我需要让控制台问你一个数字(必须大于 0),直到你说 0 它一直在问,当你说 0 时它必须停止并告诉你你说的最小数字,例如:

Give me a number (0 to finish): 4
Give me a number (0 to finish): 8
Give me a number (0 to finish): 9
Give me a number (0 to finish): 2
Give me a number (0 to finish): 0
The minimum value you said is: 2

我知道这可能很简单,但我真的无法在 :: IO() 类型的单个函数中完成它

这是我目前制作的代码:

minPos:: IO ()
minPos = do
         putStrLn ("Give me a number (0 to finish): ")
         a <- getLine
         minPos' (read a)

minPos' :: [Char] -> IO ()
minPos' a = if (read a) == 0 && (read a) > 0 then
                                                    --This should print the lowest number given
                do putStrLn "The minimum value you said is: " 
            else
                do
                putStrLn ("Give me a number (0 to finish): ")
                b <- getLine
                minPos' (minPos'' a (read b))

minPos'':: [Char] -> [Char] -> [Char]
minPos'' a b =  if (b < a && (read b) > 0) then
                    minPos' (read b)
                else minPos' (read a)

【问题讨论】:

  • 如果0是用户输入的第一个数字会发生什么?
  • @JosephSible-ReinstateMonica 我不确定,因为声明中没有指定,但我会像 Willem 那样说“未输入任何值”

标签: haskell types


【解决方案1】:

您已经在minPos 中应用了read a,因此minPos' 应该采用Int 并因此具有签名Int -&gt; IO ()。出于同样的原因,minPos'' 没有多大意义。

你可以定义一个函数:

readValue :: IO Int
readValue = do
    putStrLn ("Give me a number (0 to finish): ")
    readLn

minPos:: IO ()
minPos = do
    a <- readValue
    case a of
        0 -> putStrLn "No values entered"
        n -> minPos' a

minPos' :: Int -> IO ()
minPos' mn = do
    a <- readValue
    case a of
        …

这里minPos'mn 参数是迄今为止获得的最小值。如果a0,您需要打印该号码。如果它读取另一个项目,它应该取两者中的最小值,例如 min :: Ord a =&gt; a -&gt; a -&gt; a 并使用该最小值进行递归调用。我将填写 部分作为练习。

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 2011-07-17
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2021-03-24
    • 2023-04-10
    • 2017-09-16
    • 2013-05-04
    相关资源
    最近更新 更多