Haskell Scotty 网络编程指南-前言和基础入门

Haskell Scotty 网络编程指南

函数式 Web 开发精要


前言

在现代软件开发中,函数式编程正在重新定义我们构建应用程序的方式。Haskell 作为纯函数式编程语言的代表,其强大的类型系统和数学优雅性为 Web 开发带来了新的可能性。Scotty 框架以其简洁的 API 和强大的功能,成为 Haskell Web 开发的理想选择。

本书将带你从零开始,掌握使用 Scotty 构建现代 Web 应用程序的全过程。无论你是从其他编程语言转向 Haskell,还是想要探索函数式 Web 开发的奥秘,这本书都将为你提供系统而实用的指导。

适合读者: 具备 Haskell 基础语法知识,了解 HTTP 协议,希望学习函数式 Web 开发的程序员。


第1章:基础入门

1.1 Scotty 框架特点

Scotty 是一个轻量级的 Haskell Web 框架,灵感来源于 Ruby 的 Sinatra。它具有以下特点:

  • 简洁的 DSL:提供直观的路由定义语法
  • 类型安全:利用 Haskell 的类型系统防止运行时错误
  • 高性能:基于 WAI(Web Application Interface)构建
  • 易于扩展:支持中间件和插件系统
haskell 复制代码
-- 一个简单的 Scotty 应用示例
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

main :: IO ()
main = scotty 3000 $ do
    get "/" $ text "Hello, Scotty!"
    get "/hello/:name" $ do
        name <- param "name"
        text $ "Hello, " <> name <> "!"

1.2 环境配置

安装 Stack

Stack 是 Haskell 的现代构建工具,推荐使用它来管理项目依赖:

bash 复制代码
# 在 Ubuntu/Debian 上安装
curl -sSL https://get.haskellstack.org/ | sh

# 在 macOS 上安装
brew install haskell-stack

# 在 Windows 上下载安装器
# https://docs.haskellstack.org/en/stable/install_and_upgrade/
创建新项目

使用 stack 创建 scotty 项目

bash 复制代码
stack new hello-scotty
cd hello-scotty

生成的项目结构如下:

lua 复制代码
hello-scotty/
├── app
│   └── Main.hs          -- 应用入口点
├── CHANGELOG.md
├── LICENSE
├── package.yaml         -- 项目配置
├── README.md
├── Setup.hs
├── src
│   ├── Lib.hs           -- 主要库代码
├── stack.yaml           -- Stack 配置
└── test
    └── Spec.hs          -- 测试文件

编辑 package.yaml 添加 scotty 依赖

package.yaml

yaml 复制代码
dependencies:
- base >= 4.7 && < 5
- scotty
- aeson
- text

1.3 Hello World 项目

创建你的第一个 Scotty 应用:

app/Lib.hs

haskell 复制代码
{-# LANGUAGE OverloadedStrings #-}
module Lib
  ( someFunc
  ) where

import           Data.Aeson     (object, (.=))
import           Data.Text.Lazy (Text)
import           Web.Scotty

someFunc :: IO ()
someFunc = do
    putStrLn "Starting server on port 3000..."
    scotty 3000 routes

routes :: ScottyM ()
routes = do
  -- 基本路由
  get "/" $ text "Welcome to Scotty!"

  -- 带参数的路由
  get "/greet/:name" $ do
    name <- pathParam "name"
    text $ "Hello, " <> name <> "!"

  -- JSON 响应
  get "/api/status" $ json $ object
    [ "status" .= ("ok" :: Text)
    , "service" .= ("hello-scotty" :: Text)
    ]

运行项目:

bash 复制代码
stack build
stack exec hello-scotty-exe

运行成功输出如下:

bash 复制代码
$ stack exec hello-scotty-exe
Starting server on port 3000...
Setting phasers to stun... (port 3000) (ctrl-c to quit)

打开另一个终端,用 curl 进行测试

bash 复制代码
$ curl http://127.0.0.1:3000
Welcome to Scotty!

$ curl http://127.0.0.1:3000/greet/Lupino
Hello, Lupino!

$ curl http://127.0.0.1:3000/api/status
{"service":"hello-scotty","status":"ok"}

相关推荐
2501_9339232529 分钟前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
高级程序源1 小时前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计
后端·python·mysql·小程序·django·flask·课程设计
伊信1 小时前
Spring AI 基础学习与应用
java·后端
步行cgn2 小时前
Spring 通过 factory-method 实例化 Bean 详解与常见错误排查
java·后端
lv__pf2 小时前
seata【实战 msb】
java·开发语言·后端
Ricon组态薄荷糖2 小时前
Ricon组态系统:工业组件开发指南与实践
前端·后端·物联网
旺仔不是程序员2 小时前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写
数据库·后端·sql
右耳朵猫AI2 小时前
PHP周刊2026W38 | Laravel AI可观测、Symfony三版本、Webhook零信任、事件溯源架构
后端·php·laravel
沙蒿同学2 小时前
我把架构约定编译成了会变红的测试:Wails v2 + Go + Vue3 桌面脚手架实战
前端·后端·github
量化分析码农2 小时前
【Python量化数据工程实战 #01】拉下来的行情全是"脏数据"?停牌、跳空、异常值一站式清洗
后端