Parsing 解析输入并执行操作
我们有一个标准输入,如:Parsing 解析输入并执行操作,parsing,haskell,Parsing,Haskell,我们有一个标准输入,如: 1 2 3 4 5 6 1 3 2 5 3 2 ... 每一行正好由三个数字组成,对于每一行,我们要计算函数值 f :: (Int, Int, Int) -> Int 并打印结果。如何做到这一点?一个简单的解决方案: tuple3 :: [Int] -> (Int,Int,Int) tuple3 [x,y,z] = (x,y,z) main = mapM_ print . map (f . tuple3 . map read . words) . li
1 2 3
4 5 6
1 3 2
5 3 2
...
每一行正好由三个数字组成,对于每一行,我们要计算函数值
f :: (Int, Int, Int) -> Int
并打印结果。如何做到这一点?一个简单的解决方案:
tuple3 :: [Int] -> (Int,Int,Int)
tuple3 [x,y,z] = (x,y,z)
main = mapM_ print . map (f . tuple3 . map read . words) . lines =<< getContents
tuple3::[Int]->(Int,Int,Int)
tuple3[x,y,z]=(x,y,z)
main=mapM_uu打印。map(f.tuple3.map read.words)。lines=我将指出一些有用的函数,它们将帮助您完成任务:
readFile :: FilePath -> IO String
lines :: String -> [String]
words :: String -> [String]
print :: (Show a) => a -> IO ()
我建议您打开一个ghci
会话,对这些函数进行一点实验,看看它们能做什么,并尝试以创造性的方式将它们混合在一起。我会给你一个领先的开始:
Prelude> str <- readFile "test.txt"
Prelude> print (length (lines str))
<The number of lines in the file "test.txt">
Prelude>str打印(长度(行str))
这看起来像是一个家庭作业问题,有点可怕。到目前为止你试过什么?你认为解决方案的一部分是什么?@JameySharp不,不,即使看起来确实是这样,我也在自学Haskell:-)如果f
是f::Int->Int->Int->Int
?它将如何更改main?@Martin它无论如何都不会很整洁,但是从列表转换为元组是很难看的:不能保证列表包含所需数量的元素,生成的元组将是冗余的(末端有三种相同的类型),因此它充满了运行时异常。从美学的角度来看,这就像比较苹果和桔子。元组和列表是Haskell中类型性质完全不同的对象(与Python不同):元组是任何类型项的固定大小集合(我怀疑它只存在于编译时),列表是相同类型项的运行时序列。我要补充的另一个建议是,列表理解语法对于使此类任务可读性非常有用。使用模式匹配特别方便:[…|[a,b,c]