如何从stdin中读取整数列表,读取haskell中单独行上的每个整数?

sup*_*nux 2 stdin haskell integer list

我是Haskell的新手,但我知道C++和Java.现在我想知道如何读取类似于这个伪代码的整数列表?

   cout << "Please enter the size of your list";
   cin >> list_size;
   int mylist[listsize];
   for (int i = 0 ; i<list_size; i++) {
      cout<< "please enter the next number:";
      cin>> number;
     mylist[i]=number;
    }
Run Code Online (Sandbox Code Playgroud)

dan*_*iaz 13

链接问题中给出的答案使用惰性IO(直通getContents).

就个人而言,我不喜欢懒惰的IO,我认为试图理解它如何与do-notation结合起来是一种混淆的方法.所以这是一个不使用懒惰IO的答案:

import Control.Monad(replicateM)

main :: IO ()
main = do
    putStrLn "Please enter the size of your list"
    times <- readLn
    ns <- replicateM times 
                     (do putStrLn "please enter the next number: "
                         readLn :: IO Int) -- type annotation to remove ambiguity
    print ns
Run Code Online (Sandbox Code Playgroud)

replicateM获取数字n和有效的操作,并返回执行原始n次的新操作并返回包含结果的列表.

如果我想为每个号码显示不同的提示信息怎么办?

这可以被理解为对提示消息列表的有效转换,其通过输入的值替换每个消息.一种"有效的地图".

这个功能traverse可以在这里使用.或许for,这是翻转版本traverse:

{-# language ScopedTypeVariables #-}

import Data.Traversable (for)

main :: IO ()
main = do
    putStrLn "Please enter the size of your list"
    times :: Int <- readLn
    ns <- for [1..times]
              (\prompt -> do putStrLn ("enter " ++ show prompt)
                             readLn :: IO Int) -- type annotation to remove ambiguity
    print ns
Run Code Online (Sandbox Code Playgroud)

:: IO Int注释中的示例必需的,因为readLn可以读取具有任何类型的Read实例,但我们没有做任何事情,具体诠释的结果,所以我们需要以某种方式通知编译器的类型.