【问题标题】:Trying to write Haskell function to take string parameter and append to file尝试编写 Haskell 函数以获取字符串参数并附加到文件
【发布时间】:2019-04-20 18:10:51
【问题描述】:

我正在尝试编写一个将字符串作为输入并将其附加到文件的函数。该文件每次都是同一个文件。函数编译正确但报错

"(Show (String -> IO ())) 没有实例 由使用 `print'" 引起的。

代码是:

appendText :: String -> IO ()

appendText [] = return ()

appendText x = appendFile "testfile.txt" x 

我了解问题与类型和 Show 类型有关,但我无法理解问题以及如何解决问题。任何帮助都会很棒。

编辑:我将其称为函数,例如appendFile“随机文本”

【问题讨论】:

  • 您需要展示足够多的程序(以及您使用它的方式)以包含产生错误的部分,而您目前没有这样做。具体来说,您的任何代码都没有包含导致错误的print 的使用。尝试创建一个MCVE
  • 另外,请尽量使用代码格式化工具。 Haskell 中的缩进很重要,如果不查看代码的实际缩进方式,可能无法知道您的代码是否正确。这次我已经为你做了这件事。
  • 澄清一下,我的程序中没有使用“打印”,这就是错误让我感到困惑的原因。我包含的代码与程序中的任何其他代码完全隔离。

标签: haskell io


【解决方案1】:

您是否尝试在 GHCi 中编写 appendTextprint appendText 之类的内容?如果是这样,它正在尝试 Show 函数,这是一个类型错误,因为函数类型没有 Show 实例。您需要使用参数调用它,即要附加到 testfile.txt 的特定 String

appendText "test text"

这个的类型是IO (),所以它是一个可以执行的动作,运行之后你应该会看到文本出现在文件中。

你的函数也可以更简单地写成:

appendText x = appendFile "testfile.txt" x

或无点形式:

appendText = appendFile "testfile.txt"

【讨论】:

    【解决方案2】:

    所以要清楚,删除第二行允许函数工作:

    appendText::String -> IO()

    appendText = appendFile "testfile.txt"

    我不确定为什么这可以解决问题,该行用于错误处理目的,但显然不需要。不过可以,谢谢你的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2020-05-26
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多