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

Haskell如何打印列表中函数的名称?

解决Haskell中打印函数名称的问题

嘿,这个问题其实是因为Haskell里的函数本身不自带名字信息啦,默认打印自然只会显示<function>。不过咱们可以通过把函数和名字绑定的方式来实现你想要的效果,给你两种实用的方法:

方法1:用元组快速实现

最简单的方式就是把每个函数和它的名字打包成元组,这样打印列表时就能看到对应的名称了:

import Text.Show.Functions

f1 x = if x == 1 then 1 else 0
f2 x = if x == 2 then 1 else 0
f3 x = if x == 1 then 2 else 0

fs = [("f1", f1), ("f2", f2), ("f3", f3)]

现在打印fs,输出会是[("f1",<function>),("f2",<function>),("f3",<function>)]——虽然函数本体还是显示<function>,但你已经能清晰看到每个项对应的函数名称了。

方法2:自定义数据类型(更优雅的方案)

如果想要完全输出[f1,f2,f3]这种格式,咱们可以自定义一个带名称的函数类型,并且为它实现Show实例来控制打印逻辑:

import Text.Show.Functions

-- 自定义数据类型,包含函数名称和函数本体(这里假设你的函数是Int->Int类型,可根据实际需求调整)
data NamedFunc = NamedFunc String (Int -> Int)

-- 实现Show实例,让它打印时只输出函数名称
instance Show NamedFunc where
  show (NamedFunc name _) = name

f1 x = if x == 1 then 1 else 0
f2 x = if x == 2 then 1 else 0
f3 x = if x == 1 then 2 else 0

fs = [NamedFunc "f1" f1, NamedFunc "f2" f2, NamedFunc "f3" f3]

现在执行print fs,输出就是你期望的[f1,f2,f3]啦!

要是之后需要调用这些函数,只需要写个小辅助函数取出函数本体就行:

-- 取出NamedFunc里的函数
getFunc :: NamedFunc -> (Int -> Int)
getFunc (NamedFunc _ f) = f

-- 示例:调用列表第一个函数
main = print $ getFunc (head fs) 1  -- 输出1

内容的提问来源于stack exchange,提问作者Laci Feldsam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:21:13