haskell – 具有Text.Printf.printf的函数组合

haskell – 具有Text.Printf.printf的函数组合,第1张

概述我想定义一个记录器功能,比如 myPutStrLn = putStrLn . (++) "log: "main = do myPutStrLn "hello" 这很好.现在我想用printf格式化提供的String,就像这样 myPutStrLn $printf "test %d" (23 :: Int) 大!由于我经常使用这种模式,因此我想将printf纳入记录器功能: myPrintf = 我想定义一个记录器功能,比如

myPutStrLn = putStrLn . (++) "log: "main = do myPutStrLn "hello"

这很好.现在我想用printf格式化提供的String,就像这样

myPutStrLn $printf "test %d" (23 :: Int)

大!由于我经常使用这种模式,因此我想将printf纳入记录器功能:

myPrintf = logger . printf  where    -- note,this is just an example. should be    -- replaceable with any function with this    -- typesignature    logger :: String -> IO ()    logger = putStrLn . (++) "log: "main = myPrintf "test %d" (23 :: Int)

不幸的是,这失败了

The function `myPrintf' is applIEd to two arguments,but its type `String -> IO ()' has only oneIn a stmt of a 'do' block: myPrintf "test %d" (23 :: Int)In the Expression: do { myPrintf "test %d" (23 :: Int) }In an equation for `main':    main = do { myPrintf "test %d" (23 :: Int) }

GHC推断myPrintf :: String – > IO(),所以显然有些不对劲.我找到了一些关于Polyvariadic composition的东西,但我无法将其应用于我的问题.我甚至不确定它是否能解决我的问题.

该代码也可通过gist获得.

解决方法 您可以使用hPrintf和stdout句柄定义您的函数.

像这样,函数myPrintf的结果仍然是类HPrintfType的一个实例

myPrintf::  (HPrintfType c) => String -> cmyPrintf = (hPrintf stdout) . (printf "log:%s")main = myPrintf "test %d" (23 :: Int)

printf函数的polyvariadic形式仅适用于您具有此实例定义:

(PrintfArg a,PrintfType r) => PrintfType (a -> r).

在每个新的PrintfArg参数中,如果可能,类型推断返回PrintfType类类型.

对于工作,您的记录器功能将具有以下类型:

logger :: (PrintfType c) => String -> c

但是编译器会失败,因为函数返回IO()而不是更通用的类型类PrintfType.

在我看来,只有模块Text.Printf的修改可以帮助你,因为你无法创建PrintfType的新实例,因为某些方法被隐藏

总结

以上是内存溢出为你收集整理的haskell – 具有Text.Printf.printf的函数组合全部内容,希望文章能够帮你解决haskell – 具有Text.Printf.printf的函数组合所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1054444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存