【问题标题】:How to convert user input to Integer?如何将用户输入转换为整数?
【发布时间】:2020-05-24 17:13:06
【问题描述】:

Libs.hs:

...
--COMBINED FUNCTION TO VALIDATE A CREDIT CARD NUMBER

validateCard :: Integer -> Bool
validateCard x = compute x `mod` 10 == 0
    where
      compute :: Integer -> Integer
      compute = addNumbers . subDoubles . doubleNumber . cardNumber

--DISPLAY USER MSG IF CARD IS VALID OR NOT
isValid card
  | card == True = "This is a valid credit card!"
  | otherwise = "This card is invalid"

Main.hs:

main :: IO ()
main = do
    putStrLn "Please enter a credit card number:"
    input <- getLine
    isValid $ validateCard (read input :: Integer) --Converted to an Integer

所以我有这段 Haskell 代码。问题是该函数接受一个整数,但用户输入返回一个字符串 ([Char])。我曾尝试使用read 函数将其转换为整数,但它会将 [Char] 与预期的 IO () 类型匹配。基本上我不知道如何将用户输入从字符串转换为整数。任何建议将不胜感激!

【问题讨论】:

  • 如果你想要Integer,为什么你指定read应该给你Int而不是Integer
  • isValid 只返回一个String。你想用那个字符串做什么?
  • @JosephSible-ReinstateMonica 因为我想知道从 int 到 integer 是否更容易。我已经更改了帖子以反映我最初是如何转换它的,但错误仍然发生
  • 转换部分看起来不错 - 不是 isValid 部分。你需要一个IO (),就像putStrLn 生成的一样。尝试给 isValid 一个明确的类型来帮助你,也许一个更好的名字。
  • @JosephSible-ReinstateMonica 我想在控制台中使用isValid向用户显示字符串

标签: string haskell integer converters


【解决方案1】:

查看isValid 函数的类型:它是Bool -&gt; [Char]

编译器会告诉你

Couldn't match type ‘[]’ with ‘IO’

main 是一个 IO,所以你不能在那里使用非 IO 值。如果你想打印isValid返回的那个字符串,你只需要把它传递给putStrLn

putStrLn $ isValid $ validateCard (read input)

不需要指定read调用的类型,validateCard的类型让编译器推断出来。

请注意,当您有一个非常短的单子代码时,有时您可以选择以无点样式编写它,而不使用变量:

    main = do
      putStrLn "Please enter a credit card number:"
      fmap (isValid . validateCard . read) getLine >>= putStrLn

【讨论】:

    【解决方案2】:

    事实上,信用卡号并不是一个数字。这是一个简短的数字序列。您可以使用例如[Int],虽然这确实允许无限长的信用卡号和大于 9 或小于 0 的数字。要获得[Char]-&gt; [Int],您可以使用mapChar-&gt; Int。使用 Hoogle,我找到了Data.Char.digitToInt

    您可以相信您的用户会输入一个有限的信用卡号码,并且subDoubles= flip mod 10 加上不超过一位适合字符的数字,应该将数字保持在[0..9] 的范围内。哦,最后您可能希望使用putStrLn 将结果报告给用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多