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

OCaml是否有类似Haskell listify的特定类型值提取函数?

OCaml中是否有类似Haskell listify的泛型提取函数?

在Haskell中,结合使用listify与Data类型类,可以无需编写大量getter,直接从深度嵌套的结构中提取特定类型的值。示例代码如下:

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings  #-}

module Lib
  ( john
  , listStrings
  ) where

import           Data.Data
import           Data.Generics.Schemes
import           Data.Text

data Person = Person
  { name    :: Name
  , address :: Address
  } deriving (Data, Show)

data Name = Name
  { firstName :: Text
  , lastName  :: Text
  } deriving (Data, Show)

data Address = Address
  { addressLine :: Text
  , city        :: Text
  , province    :: Text
  , country     :: Text
  } deriving (Data, Show)

john :: Person
john =
  Person
    { name = Name {firstName = "John", lastName = "Smith"}
    , address =
        Address
          { addressLine = "1-2-3 Nantoka-kantoka-machi"
          , city = "Nishinomiya"
          , province = "Hyogo"
          , country = "Japan"
          }
    }

listStrings :: Person -> [Text]
listStrings = listify (const True)

调用listStrings john会返回john中的所有Text类型值:

ghci> listStrings john
["John","Smith","1-2-3 Nantoka-kantoka-machi","Nishinomiya","Hyogo","Japan"]

请问OCaml中是否有类似功能的函数?

背景

我正在开发一款Coq代码格式化工具,在处理符号(如_ = _)的美观打印时遇到困难。符号对应的节点构造器是CNotation,属于constr_expr_r类型。

Coq的OCaml API提供了find_notation_printing_rule函数,它接收CNotation类型的值并返回该符号的打印规则,但我不理解返回规则的含义。为此我打算编写一个打印规则导出程序:该程序接收Coq代码输入,提取其中的符号并导出包含打印规则等有用信息的内容,在提取阶段需要类似listify的函数来获取CNotation实例。


内容的提问来源于stack exchange,提问作者toku-sa-n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:58:26