Haskell:如何使用Haskeline并在同一程序中写入文件



我在Haskell中写了一个程序,该程序将吉他选项卡构建为当前目录中的TXT文件。它从用户获取一串和弦,然后构建正确的输出,然后按行将其写入文件。

使用Getline时,我无法在输入上使用backspace键,因为它会在屏幕上打印一堆Gibberish。

我正在尝试使用haskeline来解决此问题,并且我在此期间评论了我的主要方法的大部分,以便每个更改都需要更少的编辑(我在" main"中评论的每个命令都是与我保留的单个命令,因此,如果我可以使这个简化的版本起作用,那么整个过程都应该有效)。基本上,我需要能够使用haskeline从用户那里获得输入,但是后来我也需要在我的" do"块中运行一些"副作用"命令。

我是Haskell的新手,我不完全理解什么是和不允许的或原因。这是我程序的简化版本:

import Data.List
import System.Console.Haskeline
main = runInputT defaultSettings loop
 where
   loop :: InputT IO ()
   loop  = do
     name <- getInputLine "Enter name of song: "
     case name of
       Nothing -> return ()
       Just songName -> return ()
     chords <- getInputLine "Enter chords to be tabified "
     case chords of
       Nothing -> do outputStrLn $ "No chords entered. Exiting."
       Just chords -> do
                        writeFile "./test.txt" "did it work?"
                        return ()

我直接从Haskeline教程中获得了所有这些语法。我尝试运行它而没有首先进行任何更改并起作用,所以我知道这都是正确的 - 外观 - 对于我编辑的最后3行,我有" do do"块,并试图在"写filefile"之前调用" writefile"。返回()。

我知道必须输入"循环"的类型才能使用getInputline(getline的haskeline版本),但是我不知道如何完成"副作用",例如写入文件同时。

当我尝试将项目加载到GHCI中时,我会收到以下错误:

error:
-Couldn't match type 'IO' with 'InputT IO'
 Expected type: InputT IO ()
   Actual type: IO ()
- In a stmt of a 'd' block: writeFile "./test.txt" "did it work?"
  In the expression:
    do { writeFile "./test.txt" "did it work?";
         return () }
  In a case alternative:
    Just chords
      -> do { writeFile "./test.txt" "did it work?";
              return () }
Failed, modules loaded: none.

由于InputT IOMonadIO的实例,因此您可以使用

将其提升到InputT IO操作来运行任何IO操作
liftIO :: IO a -> InputT IO a

的确,这是在支持IO但不是IO的Moands中"运行IO"的标准方法。

inputt是monadtrans的一个实例

Just chords -> lift $ do

编辑:

lift在Control.Monad.Trans.Class中。(帽子提示:乔恩·帕迪)

相关内容

  • 没有找到相关文章

最新更新