2015-06-22 105 views
-1

Haskell IO系统对我来说超级难以理解,所以我有问题:如何从标准输入读取列表?我知道有函数getLine :: IO String和交互。但我不知道如何将输入转换成列表,所以我可以在这三个功能使用它:Haskell IO - 从标准输入直接读取到列表

powerset []  = [[]] 
powerset (x:xs) = xss ++ map (x:) xss 
           where xss = powerset xs 
main = print $ powerset([1,2]) 

import Control.Monad(filterM) 
p = filterM(const[True,False]) 
main = p[1,2] 

main = subsequences([1,2]) 

我希望能够写1 2 3,并通过该值的功能。你能告诉/说明怎么做吗?

额外的问题

Haskell是充满了神奇,所以我想知道是否可以使用直接输入在这样的功能:

main = subsequences(some input magic here) 
+0

所以你想阅读'stdin'的东西列表?什么?有两个可能有用的东西:Read类和readList。 – Alec

+2

你想转换什么样的输入?它是如何分离的?它包含什么样的数据? –

回答

5

你可以写:

main = readLn >>= print . subsequences 

您需要确定要读取的类型,例如通过单形subsequences或注释readLn。在ghci的:

Data.List> (readLn :: IO [Integer]) >>= print . subsequences 
[1,2,3] 
[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 

(我输入的第一行和第二行 - 都依次输入 - 第三行是结果。)

欲了解更多详情,您可以享受的一个

+0

谢谢你,你的回答非常有用!但是,你能告诉我如何使它可以在http://rextester.com/runco​​de中运行? – Cosaquee

+1

@Cosaquee Stick'import Data.List; main =(readLn :: IO [Integer])>> = print。子序列“和输入框中的[1,2,3]',然后点击”运行“。 –

+0

如果我将其复制到rextester中,它总是显示:进程死亡,因为它运行时间超过10秒。感谢您的意见,我开始了解IO系统的工作原理! – Cosaquee