haskell - 无法使用 IO Monad 打印到文件

标签 haskell monads do-notation

你好,我已经完成了我的 JSon 类型,我正在尝试将其写入文件。 我可以从前奏中执行此操作,但在使用 IO Monad 时无法执行此操作。我收到以下错误:

 Main.hs:13:24: error:
    * Couldn't match type `Char' with `[Char]'
      Expected type: String
        Actual type: Char
    * In the second argument of `writeFile', namely `val'
      In a stmt of a 'do' block: writeFile out val
      In the expression:
        do val <- renderJValue sample
           writeFile out val
   |
13 |          writeFile out val
   |                        ^^^

主要

 module Main where
        import Jlib
        import Put
        import Data.Typeable

        import System.Environment

        out="data.txt"

        main::IO()
        main=do
             val<-renderJValue sample
             writeFile out val

为什么这在 IO Monad 中不起作用,因为前奏中的 renderJValue 示例 工作正常。

Jlib.hs

data JValue=JString String
                |JNumber Double
                |JBool Bool
                |JNull
                |JObject [(String,JValue)]
                |JArray [JValue]
                deriving (Eq,Ord,Show)

Put.hs

sample=JArray[
                    JObject [("name",JString "adita"),("age",JNumber 13)],
                    JObject [("name",JString "dan"),("kids",JNumber 3)] ,
                    JNumber 3,
                    JBool False,
                    JString "Howdy"
                    ]

P.S renderJValue 返回一个字符串

P.S:如果我开始前奏,我会加载模块并渲染它起作用的值:

Prelude System.Environment Put> :load Put
Ok, two modules loaded.
Prelude System.Environment Put> renderJValue sample
"[{name:adita,age:13.0},{name:dan,kids:3.0},3.0,False,Howdy]"

最佳答案

您在这里使用renderJValue示例,就好像它是一个IO String:

main :: IO()
main=do
     <b>val <- renderJValue sample</b>
     writeFile out val

但它实际上是一个带有签名 renderJValue::JValue -> String 的函数(假设它是一个类似于 this one 的函数)。所以不涉及IO。在这种情况下,我们不使用箭头表示法。

我们可以调用该函数“内联”:

main :: IO()
main = do
     writeFile out <b>(renderJValue sample)</b>

或更短:

main :: IO()
main = writeFile out (renderJValue sample)

但是如果表达式相当长,这可能会变得非常难看。在这种情况下,我们可以决定使用 let 语句。

您可以通过删除 putStrLn 来解决此问题:

main :: IO()
main = do
    <b>let</b> val <b>=</b> renderJValue sample
    writeFile out val

关于haskell - 无法使用 IO Monad 打印到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386089/

相关文章:

haskell中与 "imperative"算法相关的性能

Haskell 记录字段依赖

haskell - Haskell monad 不强制执行的分类单子(monad)的身份是什么?

algorithm - 函数 n^2/log(n) 的大 O 是什么?

Haskell 函数不会终止

haskell - 如何找出 GHC 的数据类型的内存表示?

haskell - 状态 Monad 的范围

haskell - 是否没有标准(任一)monad 实例?

haskell - 在 Haskell do-notation 中生成唯一值

haskell - 理解简单 Reader monad 的 do 表示法 : a <- (*2), b <- (+10), return (a+b)