首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell:如何使用haskeline并在同一个程序中写入文件

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

Stack Overflow用户
提问于 2019-03-18 21:04:52
回答 2查看 552关注 0票数 2

我用Haskell编写了一个程序,它将吉他选项卡作为当前目录中的txt文件构建。它从用户那里获取一串和弦,然后构建适当的输出并逐行写入文件。

当我使用getLine时,我无法在输入上使用backspace键,因为它会在屏幕上打印一堆乱七八糟的信息。

我正在尝试使用haskeline来修复这个问题,同时我注释掉了我的主要方法的大部分内容,这样每次更改都需要更少的编辑(我在“main”中注释掉的每个命令都与我保留的单个命令的类型相同,所以如果我能够使这个简化版本正常工作,那么整个过程都应该可以工作)。基本上,我需要能够使用haskeline从用户那里获得输入,但之后我还需要在我的" do“块中运行一些”副作用“命令。

我是哈斯克尔的新手,我不完全明白什么是允许的,什么是不允许的,或者是为什么。下面是我的程序的简化版本:

代码语言:javascript
复制
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“块,并试图在”writeFile()“之前调用”“。

我知道“循环”的类型必须是InputT IO (),才能使用getInputLine (getLine的哈斯基林版本),但我不知道如何实现“副作用”,比如同时写入文件。

当我试图在ghci中加载我的项目时,我会得到以下错误:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-19 09:00:48

由于InputT IOMonadIO的一个实例,所以可以通过将其提升到InputT IO操作来运行任何IO操作,方法是

代码语言:javascript
复制
liftIO :: IO a -> InputT IO a

实际上,这是在支持IO但不是IO的moands中“运行IO”的标准方法。

票数 4
EN

Stack Overflow用户

发布于 2019-03-18 22:36:07

InputT是MonadTrans的一个实例

代码语言:javascript
复制
Just chords -> lift $ do

编辑:

liftControl.Monad.Trans.Class。(帽尖:乔恩·珀迪)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55230029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档