如何在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
相关产品推荐
相关产品推荐

