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
并使用该最小值进行递归调用。我将填写 …
部分作为练习。
所以我在考试中遇到了这个问题,但我真的不知道如何匹配数据类型。
我需要让控制台问你一个数字(必须大于 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
并使用该最小值进行递归调用。我将填写 …
部分作为练习。