有人可以向我解释为什么在使用时ghci我必须"重新装箱"monad返回的值吗?
listAction=listDirectory "D:\\"
lenAction=listAction>>=length
Run Code Online (Sandbox Code Playgroud)
错误:
Couldn't match type `Int' with `IO b0'
Expected type: [FilePath] -> IO b0
Actual type: [FilePath] -> Int
Run Code Online (Sandbox Code Playgroud)
我不明白我的逻辑存在缺陷:
listAction给了我一个IO [FilePath]listAction来[FilePath],我给它lengthlength只是将结果打印到控制台是纯函数吗?如果我说的话,是不是一样的length [1,2,3]?为什么我要再次装箱?不是monad类型的结果:[FilePath]如果是这样,为什么它不能打印结果?
lenAction=list>>=return . length
Run Code Online (Sandbox Code Playgroud) 我正在从Haskell Wikibook看一个简单的IO程序。该页面上显示的构造效果很好,但是我试图理解“如何”。
writeChar下面的函数采用一个文件路径(作为字符串)和一个字符,并将该字符写入给定路径的文件中。该函数使用括号来确保文件正确打开和关闭。在方括号中进行的三个计算中,“在中间进行运算”(据我所知)是一个lambda函数,可返回的结果hPutChar h c。
现在,hPutChar它本身具有的声明hPutChar :: Handle -> Char -> IO ()。这是我迷路的地方。我似乎已经过关h了hPutChar。我希望一个句柄能以某种方式引用打开的文件fp,但相反,它似乎是递归调用lambda函数\h。我没有看到这个lambda函数调用自身递归是如何知道写c在文件fp。
我想了解为什么不应该阅读此函数的最后一行(\h -> hPutChar fp c)。尝试以这种方式运行它会导致“无法将类型'[Char]'与'Handle'匹配”,鉴于hPutChar期望使用Handle数据类型而不是字符串,因此我认为这是明智的。
import Control.Exception
writeChar :: FilePath -> Char -> IO ()
writeChar fp c =
bracket
(openFile fp WriteMode)
hClose
(\h -> hPutChar h c)
Run Code Online (Sandbox Code Playgroud) 我正在使用Haskell编写程序,该程序需要简单的保存和加载功能。当我调用保存功能时,我需要将一个字符串放入文本文件中。调用load时,需要将字符串从文本文件中拉出。
我知道Haskell中围绕IO的复杂性。从网上的一些阅读中,我发现可以通过“主要”功能来实现。但是,我似乎只能实现保存或加载……不能同时实现。
例如,我目前具有以下功能,用于从文件读取。
main = do
contents <- readFile "Test.txt"
putStrLn contents
Run Code Online (Sandbox Code Playgroud)
我还如何实现写功能?是否必须在同一功能内?还是可以分开?另外,有没有办法让我命名函数load / save?当我实际上想调用“加载”或“保存”时必须调用“ main”是很烦的。
我在网上找不到有人同时实现这两个功能的任何示例,而我发现的任何一个实现都总是通过主要功能执行。
任何建议将不胜感激。
我正在尝试制作一个非常简单的类似蛇的游戏,如果您尝试使用已经访问过的斧头坐标,则会输掉该游戏。
到目前为止,这是起作用的代码(您可以使用箭头键移动播放器1并使用wasd移动播放器2):
import UI.NCurses
main :: IO ()
main = runCurses $ do
w <- defaultWindow
updateWindow w $ do
drawBorder Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
render
loop w [] 1 1 0 0 10 10 0 0
loop :: Window -> [(Integer, Integer)] -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Curses ()
loop w list p1x p1y p1oldDx p1oldDy p2x p2y p2oldDx p2oldDy = do
e …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Points(我创建的数据类型)列出一个列表,这个想法是在每次迭代中添加一个元素。出了点问题。
我已经尝试过p了,myLoop但它似乎也不起作用。
main = myLoop
myLoop = do
let p = []
done <- isEOF
if done
then putStrLn ""
else do inp <- getLine
let (label:coord) = words inp
p ++ [Point label (map getFloat coord)]
-- print (pointerList)
myLoop
Run Code Online (Sandbox Code Playgroud)
我得到这个输出
trabalho.hs:30:23: error:
• Couldn't match type ‘[]’ with ‘IO’
Expected type: IO Point
Actual type: [Point]
• In a stmt of a 'do' block:
p ++ [Point label (map getFloat coord)]
In the expression: …Run Code Online (Sandbox Code Playgroud) haskell ×5
io-monad ×5
do-notation ×3
if-statement ×1
io ×1
lambda ×1
list ×1
ncurses ×1
syntax ×1