You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Haskell中用类型类关联类型与对应字符串值?

嘿,这个需求在Haskell里完全能搞定!要实现类似Swift中静态协议的效果——给类型绑定固定字符串,而且不需要持有类型实例就能获取,核心就是用类型类(Typeclass),结合Haskell的类型应用(TypeApplications)或者Proxy类型来传递类型信息。

第一步:定义对应的类型类

先定义一个和Swift Resource 协议对应的类型类,里面包含一个返回字符串的函数,这个函数不需要接收类型实例参数,只和类型本身绑定:

{-# LANGUAGE TypeApplications #-} -- 开启类型应用扩展,后面会用到

class Resource a where
  resourcePathSegment :: String

第二步:给目标类型实现实例

接下来给你的Form、Invocation类型分别实现这个类型类的实例,绑定对应的字符串:

-- 先定义你的数据类型(这里用简单的空构造器示例,你可以换成自己的实际类型)
data Form = Form deriving (Show)
data Invocation = Invocation deriving (Show)

-- 给Form绑定路径段"form"
instance Resource Form where
  resourcePathSegment = "form"

-- 给Invocation绑定路径段"job"
instance Resource Invocation where
  resourcePathSegment = "job"

第三步:直接通过类型获取字符串

现在不需要创建类型实例,只要用类型应用语法(@类型名)指定具体类型,就能拿到对应的字符串:

main = do
  print $ resourcePathSegment @Form       -- 输出 "form"
  print $ resourcePathSegment @Invocation -- 输出 "job"

对接REST API的实际场景

最关键的是,你可以把这个逻辑整合到通用的API请求函数里。比如写一个自动根据返回类型生成路径的GET请求函数:

-- 模拟一个REST GET请求函数,根据返回类型自动拼接路径
get :: Resource a => IO a
get = do
  let apiPath = "/api/" ++ resourcePathSegment @a
  putStrLn $ "发送GET请求到: " ++ apiPath
  -- 这里可以替换成实际的HTTP请求逻辑,返回对应类型的实例
  case apiPath of
    "/api/form" -> return Form
    "/api/job" -> return Invocation
    _ -> error "未知资源类型"

-- 使用时,只要指定返回类型,路径会自动生成
main = do
  form <- get @Form
  print form
  invocation <- get @Invocation
  print invocation

替代方案:用Proxy传递类型(无需开启扩展)

如果你不想用TypeApplications扩展,也可以用Data.Proxy来传递类型信息,写法稍微繁琐一点,但效果一样:

import Data.Proxy (Proxy(..))

class Resource a where
  resourcePathSegment :: Proxy a -> String

instance Resource Form where
  resourcePathSegment _ = "form"

instance Resource Invocation where
  resourcePathSegment _ = "job"

-- 调用方式
main = do
  print $ resourcePathSegment (Proxy :: Proxy Form)
  print $ resourcePathSegment (Proxy :: Proxy Invocation)

这种方式完全满足你的需求:请求路径由返回数据的类型决定,在请求完成前不需要持有该类型的实例,完美适配REST API的约定。

内容的提问来源于stack exchange,提问作者Gregory Higley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:25:31