Hello World #

一、第一个Haskell程序 #

让我们从经典的Hello World开始学习Haskell。

1.1 创建源文件 #

创建文件 Hello.hs

haskell
main :: IO ()
main = putStrLn "Hello, World!"

1.2 代码解析 #

haskell
main :: IO ()
  • main:程序入口点,必须命名为main
  • :::类型签名操作符
  • IO ():IO类型,表示有副作用的操作
  • ():空元组,类似其他语言的void
haskell
main = putStrLn "Hello, World!"
  • putStrLn:输出字符串并换行的函数
  • 字符串使用双引号

二、运行Haskell程序 #

2.1 直接运行(解释执行) #

使用 runhaskell 命令:

bash
runhaskell Hello.hs

输出:

text
Hello, World!

2.2 编译后运行 #

使用 ghc 编译:

bash
ghc Hello.hs -o hello
./hello

输出:

text
Hello, World!

2.3 在GHCi中运行 #

bash
ghci

在GHCi中:

haskell
Prelude> :load Hello.hs
[1 of 1] Compiling Main             ( Hello.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Hello, World!

三、程序结构详解 #

3.1 完整程序结构 #

haskell
-- 这是单行注释

{-
  这是
  多行注释
-}

-- 模块声明(可选)
module Main where

-- 主函数
main :: IO ()
main = do
    putStrLn "Hello, World!"
    putStrLn "Welcome to Haskell!"

3.2 do语法块 #

当需要执行多个IO操作时,使用 do 块:

haskell
main :: IO ()
main = do
    putStrLn "第一行"
    putStrLn "第二行"
    putStrLn "第三行"

3.3 变量绑定 #

使用 let 在do块中定义变量:

haskell
main :: IO ()
main = do
    let name = "Haskell"
    let year = 1990
    putStrLn ("Welcome to " ++ name ++ "!")
    putStrLn ("Created in " ++ show year)

四、基本输入输出 #

4.1 输出函数 #

haskell
main :: IO ()
main = do
    -- 输出字符串并换行
    putStrLn "Hello"
    
    -- 输出字符串不换行
    putStr "Hello"
    putStr " World"
    putStrLn "!"
    
    -- 输出任意Show类型
    print 42
    print [1, 2, 3]
    print (True, "hello")

4.2 输入函数 #

haskell
main :: IO ()
main = do
    putStrLn "What is your name?"
    name <- getLine
    putStrLn ("Hello, " ++ name ++ "!")

<- 操作符从IO操作中提取值。

4.3 交互示例 #

haskell
main :: IO ()
main = do
    putStrLn "Enter your name:"
    name <- getLine
    putStrLn "Enter your age:"
    age <- getLine
    putStrLn ("Hello " ++ name ++ ", you are " ++ age ++ " years old!")

五、命令行参数 #

5.1 获取命令行参数 #

haskell
import System.Environment

main :: IO ()
main = do
    args <- getArgs
    progName <- getProgName
    putStrLn ("Program: " ++ progName)
    putStrLn ("Arguments: " ++ show args)

5.2 参数处理示例 #

haskell
import System.Environment

main :: IO ()
main = do
    args <- getArgs
    case args of
        []      -> putStrLn "Usage: hello <name>"
        (name:_) -> putStrLn ("Hello, " ++ name ++ "!")

六、编译选项 #

6.1 常用GHC选项 #

bash
# 输出可执行文件名
ghc Hello.hs -o hello

# 优化编译
ghc -O2 Hello.hs -o hello

# 生成中间代码
ghc -S Hello.hs

# 显示警告
ghc -Wall Hello.hs

# 动态链接
ghc -dynamic Hello.hs

6.2 使用Cabal #

创建 hello.cabal 文件:

text
name:                hello
version:             0.1.0.0
executable hello
    main-is:         Hello.hs
    build-depends:   base
    default-language: Haskell2010

编译运行:

bash
cabal build
cabal run hello

6.3 使用Stack #

创建 stack.yaml 和项目结构:

bash
stack new hello simple
cd hello
stack build
stack exec hello-exe

七、错误处理 #

7.1 常见错误 #

haskell
-- 错误:类型不匹配
main = putStrLn 42  -- 错误!putStrLn需要String

-- 正确:转换类型
main = print 42     -- print可以输出任意Show类型

7.2 处理可能的失败 #

haskell
main :: IO ()
main = do
    putStrLn "Enter a number:"
    input <- getLine
    let maybeNum = reads input :: [(Int, String)]
    case maybeNum of
        [(n, "")] -> putStrLn ("You entered: " ++ show n)
        _         -> putStrLn "Invalid number!"

八、实战练习 #

8.1 简单计算器 #

haskell
main :: IO ()
main = do
    putStrLn "Enter first number:"
    a <- readLn :: IO Int
    putStrLn "Enter second number:"
    b <- readLn :: IO Int
    putStrLn ("Sum: " ++ show (a + b))
    putStrLn ("Product: " ++ show (a * b))

8.2 猜数字游戏 #

haskell
import System.Random

main :: IO ()
main = do
    target <- randomRIO (1, 100) :: IO Int
    putStrLn "I'm thinking of a number between 1 and 100"
    gameLoop target

gameLoop :: Int -> IO ()
gameLoop target = do
    putStrLn "Enter your guess:"
    guess <- readLn :: IO Int
    if guess < target
        then do
            putStrLn "Too low!"
            gameLoop target
        else if guess > target
            then do
                putStrLn "Too high!"
                gameLoop target
            else putStrLn "Correct! You win!"

九、总结 #

Hello World程序要点:

  1. 入口点main :: IO () 是程序入口
  2. 输出:使用 putStrLnprint
  3. 输入:使用 getLine<-
  4. 运行runhaskellghc 编译
  5. 多操作:使用 do 块组合IO操作

现在你已经学会了编写和运行Haskell程序,让我们继续学习Haskell的基础语法。

最后更新:2026-03-27