- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个字符串列表,并尝试了这个:
ls = [ "banana", "mango", "orange" ]
main = do
map PutStrLn list_of_strings
这不起作用,我不明白为什么。
ghc print-list.hs
print-list.hs:3:0:
Couldn't match expected type `IO t' against inferred type `[IO ()]'
In the expression: main
When checking the type of the function `main'
有什么提示吗?我想这与 map 返回列表而不是值有关,但我没有找到解决此问题的简单方法。
现在我知道打印字符串列表的唯一方法是编写一个函数来迭代列表,打印每个元素(如果列表是 [a] 则打印,但如果是 (a:b 则打印并递归))。但仅使用 map 会简单得多...
谢谢!
最佳答案
main
函数的类型应为 IO t
(其中 t
是类型变量)。 map putStrLn ls
的类型为[IO ()]
。这就是您收到此错误消息的原因。您可以通过在 ghci
中运行以下命令自行验证:
Prelude> :type map putStrLn ls
map putStrLn ls :: [IO ()]
该问题的一种解决方案是使用 mapM
,这是 map
的“monadic”版本。或者您可以使用mapM_
它与mapM
相同,但不收集函数的返回值。由于您不关心 putStrLn
的返回值,因此这里使用 mapM_
更合适。 mapM_
具有以下类型:
mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
使用方法如下:
ls = [ "banana", "mango", "orange" ]
main = mapM_ putStrLn ls
关于Haskell:无法使用 "map putStrLn"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/932639/
我知道如果我有多个线程调用 putStrLn没有任何类型的并发控制,线程的输出可能是交错的。 我的问题是 putStrLn这个交错输出是线程安全的模数吗? 我假设 putStrLn是一个缓冲的写操作,
我正在尝试 wxHaskell。我无法在 ghci 下运行该应用程序,因此我必须使用应用程序来测试它。我想用 println 调试来测试程序。但是,putStrLn 似乎在 GUI 中不起作用: {-
这个问题在这里已经有了答案: Why shouldn't I mix tabs and spaces? (1 个回答) 5年前关闭。 当我尝试编译下面的列表时 import System.Enviro
我正在尝试在 Haskell 函数中调用“打印输出”函数。 (一个简单的调试消息)。 以下是来自编译器(GHC 6.10)的代码和错误消息。 我不太明白为什么它把 putStr 混为一谈。调用和空数组
当我使用 putStrLn txt从 Haskell 的几个线程中,可以将文本插入行尾,但如果我使用 putStr $ txt ++ "\n"总是有效。 这样对吗?我做错了什么? 示例 1: thre
我制作了一个小型生命游戏程序,它可以自行迭代几代人。问题是每次迭代时,putStrLn 函数都会大大减慢,我不知道为什么。这是代码: import Control.Concurrent data Ce
我有一个字符串列表,并尝试了这个: ls = [ "banana", "mango", "orange" ] main = do map PutStrLn list_of_strings
为了练习并发编程,我编写了以下(次优)程序,该程序重复计算第一个大于用户输入的素数: import Control.Concurrent import Control.Concurrent.Chan
我刚刚编写了我的第一个 Haskell 程序,但是有一个我无法理解的错误。我认为这是正确的,因为我只是像书中的示例一样编写它。有人可以帮我吗? main = do putStrLn "Hell
这个问题在这里已经有了答案: Wrong IO actions order using putStr and getLine (1 个回答) 关闭去年。 我是从 Learn You a Haskel
下面的代码: Prelude> :t putStrLn putStrLn :: String -> IO () Prelude> putStrLn "test" test it :: () Prelu
最近,我开始学习 Haskell,因为我想扩大我在函数式编程方面的知识,我必须说到目前为止我真的很喜欢它。我目前使用的资源是 Pluralsight 上的类(class)“Haskell Fundam
这个问题已经有答案了: IO happens out of order when using getLine and putStr (3 个回答) 已关闭 9 年前。 假设我们有一个简短的 haske
Prelude> mapM putStrLn ["a", "b"] a b [(),()] Prelude> mapM_ putStrLn ["a", "b"] a b 为什么第一个版本显示第三行而第
我试图通过添加对“putStrLn”的调用来显示一个 Haskell 函数: isPrime2 1 = False isPrime2 n = do putStrLn n null (f
我是 Haskell 的新手。我的 Haskell 脚本与 GHCi, Prelude> let a = putStrLn getLine 犯了这样的错误。 :1:17: Couldn't m
我正在使用 Haskell 轻量级线程 ( forkIO ) 使用以下代码: import Control.Concurrent beginTest :: IO () beginTest = go
实际上,标题说明了一切。我不明白为什么下面的代码实际上并没有打印“Hello World”而不是 >>=做。 main = fmap putStrLn getLine 目前,这是我的推理路线,请检查它
我有一个简单的程序,只需从用户处获取一个字符串和一个 key ,并使用凯撒密码函数对该字符串进行加密。该函数本身可以工作,所以我不会展示其来源。问题是,当编译器编译程序时,它将允许我输入所有 getL
我将 Haskell 与使用箭头语言扩展的 Yampa FRP 库一起使用。 我怎样才能在 SF 中做一个简单的 putStrLn? mySF = proc x -> do y IO ()
我是一名优秀的程序员,十分优秀!