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程序要点:
- 入口点:
main :: IO ()是程序入口 - 输出:使用
putStrLn或print - 输入:使用
getLine和<- - 运行:
runhaskell或ghc编译 - 多操作:使用
do块组合IO操作
现在你已经学会了编写和运行Haskell程序,让我们继续学习Haskell的基础语法。
最后更新:2026-03-27