在 Haskell 中将字符串和整数写入标准输出

Writing String and integer to stdout in Haskell

我是 Haskell 的新手,我想知道如何在 Haskell 中打印某些函数返回的字符串和整数值,就像我们在 C++ 中所做的那样。

#include <iostream>
using namespace std;

int solve(int a) {
  return a * a;
}

int main() {
  int cases, number;
  cin >> cases;

  for (int cs = 1; cs <= cases; cs++) {
    cin  >> number; 
    cout << "Case " << cs << ": " << solve(number) << endl;
  }

  return 0;
}

我在 Haskell 中尝试过类似的方法,但运气不好并出现错误。

solve :: Int -> Integer
solve = …

main = do
  n <- readLn
  forM_ [1..n] (\i -> do
    m <- readLn
    printf "Case %d: %d" i (solve m))

使用forM_ [1..n::Int]让编译器知道你想要n的类型。否则没有足够的信息供 readLn 进行类型检查。

main :: IO ()
main = do
    n <- readLn
    forM_ [1..n::Int] (\i -> do
        m <- readLn
        printf "Case %d: %d\n" i (solve m))

printf 在不需要 Haskell 的奇特功能(例如 %04d 或更复杂的格式字符串)时,不会在 Haskell 中如此使用。更惯用的方式可能是

main :: IO ()
main = do
    n <- readLn
    forM_ [1..n::Int] (\i -> do
        m <- readLn
        putStrLn $ "Case " ++ show i ++ ": " ++ show (solve m)

函数 show 几乎可以将任何内容转换为字符串。