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实例,但我们没有做任何事情,具体诠释的结果,所以我们需要以某种方式通知编译器的类型.