Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 解析输入并执行操作_Parsing_Haskell - Fatal编程技术网

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]