我是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;
}
答案 0 :(得分: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
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
示例中需要:: IO Int
注释,因为readLn
可以读取具有Read
实例的任何类型,但我们没有对结果进行任何特定的Int,因此我们需要以某种方式告知编译器类型。