IO() 递归类型匹配问题

IO() Recursive Type Matching Issue

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

我需要让控制台问你一个数字(必须大于 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)

您已经在 minPos 中应用了 read a,因此 minPos' 应该采用 Int,因此具有签名 Int -> 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参数是目前得到的最小值。如果 a 因此是 0,您需要打印该数字。如果它读取另一个项目,它应该取两者中的最小值,例如 min :: Ord a => a -> a -> a 并使用该最小值进行递归调用。我将填写 部分作为练习。