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"}

相关推荐
Justin3go3 小时前
HUNT0 上线了——尽早发布,尽早发现
前端·后端·程序员
Tony Bai4 小时前
高并发后端:坚守 Go,还是拥抱 Rust?
开发语言·后端·golang·rust
一线大码4 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_425023005 小时前
Spring Boot 配置文件优先级详解
spring boot·后端·python
weixin_425023005 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码5 小时前
Java 8-25 各个版本新特性总结
java·后端
VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
To Be Clean Coder5 小时前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
weixin199701080166 小时前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring
自己的九又四分之三站台7 小时前
导入数据到OG GraphQL以及创建graph
java·后端·graphql