标签: io-monad

为GHCI重新装箱纯值的目的

有人可以向我解释为什么在使用时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)

我不明白我的逻辑存在缺陷:

  1. 使用listAction给了我一个IO [FilePath]
  2. 我拆箱的价值listAction[FilePath],我给它length
  3. 现在不应该length只是将结果打印到控制台是纯函数吗?如果我说的话,是不是一样的length [1,2,3]

为什么我要再次装箱?不是monad类型的结果:[FilePath]如果是这样,为什么它不能打印结果?

lenAction=list>>=return . length
Run Code Online (Sandbox Code Playgroud)

haskell io-monad

0
推荐指数
1
解决办法
58
查看次数

是ha句柄还是lambda函数(或两者)?

我正在从Haskell Wikibook看一个简单的IO程序。该页面上显示的构造效果很好,但是我试图理解“如何”。

writeChar下面的函数采用一个文件路径(作为字符串)和一个字符,并将该字符写入给定路径的文件中。该函数使用括号来确保文件正确打开和关闭。在方括号中进行的三个计算中,“在中间进行运算”(据我所知)是一个lambda函数,可返回的结果hPutChar h c

现在,hPutChar它本身具有的声明hPutChar :: Handle -> Char -> IO ()。这是我迷路的地方。我似乎已经过关hhPutChar。我希望一个句柄能以某种方式引用打开的文件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)

syntax lambda haskell functional-programming io-monad

0
推荐指数
1
解决办法
99
查看次数

我可以在不使用“主要”功能的情况下拥有单独的用于读写Haskell中的txt文件的功能吗?

我正在使用Haskell编写程序,该程序需要简单的保存和加载功能。当我调用保存功能时,我需要将一个字符串放入文本文件中。调用load时,需要将字符串从文本文件中拉出。

我知道Haskell中围绕IO的复杂性。从网上的一些阅读中,我发现可以通过“主要”功能来实现。但是,我似乎只能实现保存或加载……不能同时实现。

例如,我目前具有以下功能,用于从文件读取。

main = do  
 contents <- readFile "Test.txt"  
 putStrLn contents  
Run Code Online (Sandbox Code Playgroud)

我还如何实现写功能?是否必须在同一功能内?还是可以分开?另外,有没有办法让我命名函数load / save?当我实际上想调用“加载”或“保存”时必须调用“ main”是很烦的。

我在网上找不到有人同时实现这两个功能的任何示例,而我发现的任何一个实现都总是通过主要功能执行。

任何建议将不胜感激。

io haskell program-entry-point do-notation io-monad

0
推荐指数
1
解决办法
64
查看次数

do块中的if语句给出错误消息

我正在尝试制作一个非常简单的类似蛇的游戏,如果您尝试使用已经访问过的斧头坐标,则会输掉该游戏。

到目前为止,这是起作用的代码(您可以使用箭头键移动播放器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)

haskell if-statement ncurses do-notation io-monad

-1
推荐指数
1
解决办法
61
查看次数

Haskell中的“无法将类型'[]'与'IO'匹配”错误

我正在尝试用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 list type-mismatch do-notation io-monad

-1
推荐指数
1
解决办法
76
查看次数