Haskell,使用用户输入创建列表
你好,我需要从用户输入创建一个列表,并在检测到“结束”时停止。 我正在学习Haskell,所以它和IO有点混淆 我有这段代码递归地将输入添加到列表中,当用户编写“END”时,它会给出列表Haskell,使用用户输入创建列表,haskell,Haskell,你好,我需要从用户输入创建一个列表,并在检测到“结束”时停止。 我正在学习Haskell,所以它和IO有点混淆 我有这段代码递归地将输入添加到列表中,当用户编写“END”时,它会给出列表 getList :: [String] -> IO [String] getList list = do line <- getLine if line == "END" then return list
getList :: [String] -> IO [String]
getList list = do line <- getLine
if line == "END"
then return list
else getList (line : list)
我主要称之为测试
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 [])
| ^^^^^^^^^^^^^^^^^^
我看到印刷品是:
打印::显示a=>a->IO()
所以我不明白为什么它不能编译。对我来说,IO是编译器执行的一项操作。所以getList::[String]->IO[String]
IO[String]是编译器执行操作并返回[String]?正如您所说,
print
具有类型
print :: Show a => a -> IO ()
而且getList[]
具有类型IO[String]
,因此对于print(getList[])
要进行类型检查,必须有IO[String]
的Show
实例。没有这样的实例,这会导致错误
但是,[String]
有一个Show
实例,因此您可以在执行getList[]
返回的列表上调用print
。您可以使用do
表示法绑定结果以调用打印:
checkDebruijn sequence alphabet = do
result <- (getList [])
print result
checkDebruijn序列字母表=do
结果正如您所说,print
具有类型
print :: Show a => a -> IO ()
而且getList[]
具有类型IO[String]
,因此对于print(getList[])
要进行类型检查,必须有IO[String]
的Show
实例。没有这样的实例,这会导致错误
但是,[String]
有一个Show
实例,因此您可以在执行getList[]
返回的列表上调用print
。您可以使用do
表示法绑定结果以调用打印:
checkDebruijn sequence alphabet = do
result <- (getList [])
print result
checkDebruijn序列字母表=do
结果您的主视图应该如下所示:
main = getList [] >>= print
其中:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
或者:
main = do
xs <- getList []
print xs
main=do
xs您的main应该如下所示:
main = getList [] >>= print
其中:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
或者:
main = do
xs <- getList []
print xs
main=do
xs请注意,您的读卡器将生成一个反向列表。请注意,您的读卡器将生成一个反向列表。