您好我需要从用户输入创建一个列表,并在检测到“END”时停止。 我正在学习Haskell,所以它与IO有点混淆。
我有这个代码在列表中递归添加输入,当用户写“END”时,它会给出列表
getList :: [String] -> IO [String]
getList list = do line <- getLine
if line == "END"
then return list
else getList (line : list)
我尝试捕获结果并在此函数中打印它,它已经采用了两个我没有编码的参数。
checkDebruijn :: Int -> String -> IO ()
checkDebruijn sequence alphabet = do
print (getList [])
我称之为主要测试它
main :: IO ()
main = do
print (checkDebruijn 0 "")
我有这个错误:
No instance for (Show (IO [String]))
arising from a use of ‘print’
• In a stmt of a 'do' block: print (getList [])
In the expression: do print (getList [])
In an equation for ‘checkDebruijn’:
checkDebruijn sequence alphabet = do print (getList [])
|
7 | print (getList [])
| ^^^^^^^^^^^^^^^^^^
我看到打印件是: print ::显示a =&gt; a - &gt; IO() 所以我不明白为什么它不会编译。对我来说, IO 是编译器执行的操作。所以getList :: [String] - &gt; IO [String] IO [String]是编译器执行操作并返回[String]?
的时间答案 0 :(得分:2)
正如您所说,print
的类型为
print :: Show a => a -> IO ()
且getList []
的类型为IO [String]
,因此要print (getList [])
进行类型检查,Show
必须有IO [String]
个实例。没有这样的实例,导致错误。
Show
有[String]
个实例,因此您可以在执行print
返回的列表上调用getList []
。您可以使用do
表示法将结果绑定到其上调用print:
checkDebruijn sequence alphabet = do
result <- (getList [])
print result
答案 1 :(得分:2)
你的主要应该是这样的:
main = getList [] >>= print
其中:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
或者:
main = do
xs <- getList []
print xs