gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:19:03 24 4
gpt4 key购买 nike

我用 Haskell 编写了一个程序,在当前目录中将吉他谱构建为 txt 文件。它从用户处获取一串和弦,然后构建正确的输出并将其逐行写入文件。

当我使用 getLine 时,我无法在输入中使用退格键,因为它会在屏幕上打印一堆乱码。

我正在尝试使用 haskeline 来解决这个问题,同时我注释掉了大部分主要方法,以便每次更改都需要更少的编辑(我在“main”中注释掉的每个命令的类型与我保留的单个命令,所以如果我能让这个简化版本工作,整个事情应该工作)。基本上,我需要能够使用 haskeline 从用户那里获取输入,但是在执行此操作后,我还需要在“do” block 中运行一些“副作用”命令。

我是 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” block ,并且尝试在“之前调用”writeFile”返回()”。

我知道“循环”的类型必须是InputT IO ()才能使用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 的实例,因此您可以通过将任何 IO 操作提升为 InputT IO 操作来运行,使用

liftIO :: IO a -> InputT IO a

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

关于Haskell:如何使用 haskeline 并在同一程序中写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55230029/

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