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

相关推荐
邹小邹几秒前
Go 1.25 强势来袭:GC 速度飙升、并发测试神器上线,内存检测更精准!
后端·go
lichenyang4534 分钟前
管理项目服务器连接数据库
数据库·后端
生无谓6 分钟前
在Windows系统上安装多个JDK版本并切换
后端
唐叔在学习14 分钟前
万字长文深度解析HTTPS协议
后端·https
赵星星52030 分钟前
透彻理解Java中的深拷贝与浅拷贝:从误区到最佳实践
java·后端
黑客影儿42 分钟前
Java技术总监的成长之路(技术干货分享)
java·jvm·后端·程序人生·spring·tomcat·maven
京东云开发者1 小时前
库存平台稳定性建设实践
后端
wenb1n1 小时前
SmartDB:AI与数据库的“翻译官”,开启无缝交互新时代!
后端
bobz9651 小时前
Supervisord 自动重启子进程
后端
ezl1fe1 小时前
RAG 每日一技(十八):手写SQL-RAG太累?LangChain的SQL智能体(Agent)前来救驾!
数据库·人工智能·后端