如何将 readProcess monad 与 Haskell 中的 where 结合起来?
How to combine a readProcess monad with where in Haskell?
以下脚本旨在作为已发布且有效的 Pandoc Haskell filter script 的扩展。添加的是对 shell 命令的调用 curl
.
#!/usr/bin/env runhaskell
-- svgtex.hs
import Text.Pandoc.JSON
import System.Process
curl latex = readProcess "curl" ["-d", "type=tex&q=" ++ latex, "http://localhost:16000"] ""
main = toJSONFilter svgtex
where svgtex (Math style latex) = do
svg <- curl latex
return (Math style (svg))
svgtex x = x
然而,作为 Haskell 函数式编程的新手,我的脚本失败也就不足为奇了:
Couldn't match expected type `IO Inline' with actual type `Inline'
In the expression: x
In an equation for `svgtex': svgtex x = x
In an equation for `main':
...
尽管跳过了一些在线 Haskell 教程和 StackExchange 问答,但我仍然没有完全理解 monad 的概念。因此,非常感谢对上述脚本中所有错误的详细解释!
问题出在这里:
svgtex x = x
编译器抱怨
Couldn't match expected type `IO Inline' with actual type `Inline'
因为 x
是 Inline
,而 svgtex
必须 return 是 IO Inline
。要将 x
注入 IO
monad,我们可以简单地使用 return
函数
svgtex x = return x
要完全了解发生了什么,请参阅任何 monad 教程(或 LYAH)。粗略地说,IO Inline
类型的值表示可以执行任意数量的 I/O 的操作,最后 return 类型 Inline
的值。 return
函数用于将纯值转换为虚拟 IO
操作,该操作不执行任何 I/O,而只是 return 结果。
以下脚本旨在作为已发布且有效的 Pandoc Haskell filter script 的扩展。添加的是对 shell 命令的调用 curl
.
#!/usr/bin/env runhaskell
-- svgtex.hs
import Text.Pandoc.JSON
import System.Process
curl latex = readProcess "curl" ["-d", "type=tex&q=" ++ latex, "http://localhost:16000"] ""
main = toJSONFilter svgtex
where svgtex (Math style latex) = do
svg <- curl latex
return (Math style (svg))
svgtex x = x
然而,作为 Haskell 函数式编程的新手,我的脚本失败也就不足为奇了:
Couldn't match expected type `IO Inline' with actual type `Inline'
In the expression: x
In an equation for `svgtex': svgtex x = x
In an equation for `main':
...
尽管跳过了一些在线 Haskell 教程和 StackExchange 问答,但我仍然没有完全理解 monad 的概念。因此,非常感谢对上述脚本中所有错误的详细解释!
问题出在这里:
svgtex x = x
编译器抱怨
Couldn't match expected type `IO Inline' with actual type `Inline'
因为 x
是 Inline
,而 svgtex
必须 return 是 IO Inline
。要将 x
注入 IO
monad,我们可以简单地使用 return
函数
svgtex x = return x
要完全了解发生了什么,请参阅任何 monad 教程(或 LYAH)。粗略地说,IO Inline
类型的值表示可以执行任意数量的 I/O 的操作,最后 return 类型 Inline
的值。 return
函数用于将纯值转换为虚拟 IO
操作,该操作不执行任何 I/O,而只是 return 结果。