haskell 如何读取用户的输入?

kmbjn2e3  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(159)

如何要求用户给予一个7位数的数字,并定义一个函数将这些数字转换成一个单独的整数列表。示例:

toDigits (1234567) = [1, 2, 3, 4, 5, 6, 7]
toDigitsReverse 1234567 = [7, 6, 5, 4, 3, 2, 1]

NB.(1234567)应由用户输入。
我知道如何提示用户和函数将其放入数组中,但不知道如何将它们放在一起。这就是我目前得到的结果--将它们分开的函数。

toDigits :: Integral x => x -> [x]
toDigits 0 = []
toDigits x = toDigits (x div 10) ++ [x mod 10]

main :: IO ()
main = do 
    putStr "The split array is "
    print(toDigits 1234567)

如何让todigit函数接受输入?
我还尝试了以下操作,但它给出了错误

toDigits :: Integer -> [Int]
toDigits n = map (\x -> read [x] :: Int) (show n)

main :: IO ()
main = do
    putStrLn "Please enter the USI number: "
    usi <- getLine
    let usiasnumber = read usi :: Int
    print("The USI split into single digit array is " ++ toDigits usiasnumber)

我这样做了,但它不起作用。我哪里出错了?这是它给我的错误
无法将类型“Int”与“Char”匹配。预期类型:[Char]实际类型:[整数]

yftpprvb

yftpprvb1#

从用户那里得到一个数字的通常方法是从用户那里得到一个字符串,然后把它转换成一个数字。从那里转换成数字和转换回字符串是一样的。因此,我建议你跳过中间的步骤,直接从字符串转换成数字列表。如果你想把数字反转并打印出来,那么,就这样做吧:

import Control.Monad
main = putStrLn . reverse =<< getLine

如果您要将数字用于其他用途,您可能希望它们是数字形式而不是字符形式; digitToInt将为您完成此操作。

import Data.Char
main = map digitToInt <$> getLine -- exercise for the reader: do somethin' with the digits

相关问题