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

如何在Haskell中实现调用printf的可变参数panic函数?

解决方案

要实现支持可变参数的panic函数,你可以利用Text.Printf的PrintfType类型类特性,先让格式字符串接收所有参数生成完整消息,再拼接级别信息后抛出异常。以下是正确实现:

import Text.Printf

panic :: PrintfType r => Int -> String -> r
panic lvl fmt = error . printf "%s: %d" =<< printf fmt

代码说明

  • printf fmt:处理传入的格式字符串和后续可变参数,最终生成基础错误消息字符串。
  • printf "%s: %d":将基础消息与级别拼接成最终的异常文本。
  • =<<:实现延迟求值,确保printf fmt先接收完所有参数生成字符串后,再传递给拼接函数,最后通过error抛出异常。

验证示例

调用方式完全符合你的预期:

panic 0 "Err"                   -- 抛出异常: "Err: 0"
panic 1 "Err %s %d" "fatal" 42  -- 抛出异常: "Err fatal 42: 1"

原代码问题分析

你之前的实现中,flip fail (show lvl) . printf fmt存在类型不匹配问题:当格式字符串需要可变参数时,printf fmt返回的是接收参数的函数(而非直接的String),无法直接与fail(要求String作为输入)组合。而上述解决方案通过=<<处理了这种延迟求值场景,确保所有参数传入后再执行异常抛出逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:22:22