Haskell,用用户输入创建列表

时间:2018-05-01 10:01:46

标签: haskell

您好我需要从用户输入创建一个列表,并在检测到“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]?

的时间

2 个答案:

答案 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