Haskell,使用用户输入创建列表

Haskell,使用用户输入创建列表,haskell,Haskell,你好,我需要从用户输入创建一个列表,并在检测到“结束”时停止。 我正在学习Haskell,所以它和IO有点混淆 我有这段代码递归地将输入添加到列表中,当用户编写“END”时,它会给出列表 getList :: [String] -> IO [String] getList list = do line <- getLine if line == "END" then return list

你好,我需要从用户输入创建一个列表,并在检测到“结束”时停止。 我正在学习Haskell,所以它和IO有点混淆

我有这段代码递归地将输入添加到列表中,当用户编写“END”时,它会给出列表

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请注意,您的读卡器将生成一个反向列表。请注意,您的读卡器将生成一个反向列表。