You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中如何输入数值类型?对整数用getLine输入的疑问

How to Read Integers/Floats in Haskell (Beyond getLine and getChar)

Great question! Let's clear up that confusion right away. The example you saw uses getLine to read a number, but there's a key detail here: getLine always returns a String, not an integer or float. That example just prints the input string directly—it doesn't actually treat it as a numeric type. Let's dive into how to properly read and convert numeric inputs in Haskell.

1. Converting a String to a Numeric Type with read

To turn the string from getLine into an integer or float, you use the read function. Since read is polymorphic (it works with many types), you need to specify what type you want to convert to using a type annotation.

Example: Reading an Integer

main = do
  putStrLn "Enter any number: "
  numStr <- getLine
  let num = read numStr :: Int  -- Explicitly convert to Int
  putStrLn ("You entered the integer: " ++ show num)
  -- Now you can use `num` in numeric operations!
  putStrLn ("Double that number is: " ++ show (num * 2))

Example: Reading a Float/Double

For floating-point numbers, just change the type annotation to Float or Double:

main = do
  putStrLn "Enter a floating-point number: "
  numStr <- getLine
  let num = read numStr :: Double
  putStrLn ("Your number plus 1.5 is: " ++ show (num + 1.5))

2. Handling Invalid Inputs Safely

The problem with plain read is that it will crash your program if the input isn't a valid number (like if someone enters "abc" instead of 5). For safer input handling, use readMaybe from the Text.Read module—it returns a Maybe type, which lets you gracefully handle errors.

import Text.Read (readMaybe)

main = do
  putStrLn "Enter an integer: "
  numStr <- getLine
  case readMaybe numStr :: Maybe Int of
    Just validNum -> putStrLn ("Valid integer: " ++ show validNum)
    Nothing -> putStrLn "Oops, that's not a valid integer! Try again."

3. Is There a "getInt" or "getFloat" Function?

Short answer: No, there's no built-in getInt or getFloat in Haskell's standard IO library. The standard approach is always to read a string with getLine (or getContents for larger input) and then convert it to the desired numeric type using read or readMaybe.

This might seem like extra steps compared to other languages, but it aligns with Haskell's focus on type safety and pure functions—separating the IO action (reading the string) from the pure conversion logic (turning string to number).

Recap of Your Original Example

The code you shared:

main = do
  putStrLn "Enter any number : "
  num <- getLine
  putStrLn ("number is "++num)

Works because it's just taking the input string ("5") and concatenating it with another string. If you tried to do something like num + 1 here, it would throw a compile error—since num is a String, not a numeric type.


内容的提问来源于stack exchange,提问作者Rahat Batool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:47:26