gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:17:00 24 4
gpt4 key购买 nike

你好,我已经完成了我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com