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

相关推荐
颜酱3 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
小码哥_常4 小时前
Java后端定时任务抉择:@Scheduled、Quartz、XXL - Job终极对决
后端
uzong4 小时前
Skill 被广泛应用,到底什么是 Skill,今天详细介绍一下
人工智能·后端·面试
小码哥_常4 小时前
Kafka平替!SpringBoot+Redis Stream+消费组打造极致消息队列
后端
IT_陈寒6 小时前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端
uzong6 小时前
Harness Engineering 是什么?一场新的 AI 范式已经开始
人工智能·后端·架构
唐叔在学习7 小时前
Python桌面端应用最小化托盘开发实践
后端·python·程序员
yuhaiqiang7 小时前
被 AI 忽悠后,开始怀念搜索引擎了?
前端·后端·面试
二闹7 小时前
Python文件读取三巨头你该选择哪一个?
后端·python
苏三说技术8 小时前
推荐几个牛逼的AI Agent项目
后端