- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个文件 (points.txt),其中定义了一些笛卡尔坐标:
A 1.0 2.2
B 2.1 3.0
C 3.5 4.0
D 4.0 5.0
我有第二个文件 (routes.txt),其中包含基于 points.txt 中的点定义的路线。
route1 ACDB
route2 ABC
我需要找到每条路线的长度。到目前为止,我已经计算了两点之间的距离,如下所示:
type Point = (String, Float, Float)
distance_points :: IO ()
distance_points = do s <- readFile "pontos.txt"
putStr "Fom: "
p1 <- getLine
putStr "To: "
p2 <- getLine
print ( distance (search_point p1 (map words (lines s))) (search_point p2 (map words (lines s))))
search_point :: String -> [[String]] -> Point
search_point pt ([p,c1,c2]:xs) = if pt == p then (p, read(c1)::Float, read(c2)::Float)
else search_point pt xs
distance :: Point -> Point -> Float
distance (s1,x1,y1) (s2,x2,y2) = sqrt ((x1-x2)^2 + (y1-y2)^2)
如何计算路线的完整距离?
另外,如果我有几条路线,如何找到最长的一条?
提前致谢。
最佳答案
最简单的方法是先用纯代码解决你的问题,然后再添加文件读取。否则你会忍不住写很多 IO 代码。
如果将名称与坐标分开会更容易:
type Coordinates = (Float,Float)
type Name = Char -- You had String, which is also fine
type Point = (Name, Coordinates)
type Points = [Point] -- or Map String Point from Data.Map
然后有一些练习数据:
sampleData :: Points
sampleData = [('A',(1.0,2.2), .....
首先,您需要一个函数,它接受一个名称并为您提供一些坐标。
coordinates :: Points -> Name -> Coordinates
如果我们使用[Point]
,最简单的方法是使用lookup
。 (您可以在 hoogle like this 上或通过输入 like this 找到有关函数的信息,尽管没有明显的方法让您知道您想要一个 Maybe
,并且当您只是搜索 [(a,b)] -> b
,查找是很长的路要走。)
如果您在此步骤中需要帮助,请发表评论。
使用它你将能够编写
distBetween :: Points -> Name -> Name -> Float
getPath :: String -> [(Name,Name)]
或者(更酷)使用 zipWith
来获取距离。之后,应用 sum
应该很容易解决问题。
制作这个配对列表的好方法是使用我们用于斐波那契数的技巧 (fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
)用它的尾部发挥作用。如果你还没有遇到它,zip像这样工作:
ghci> zip [1..5] "Hello Mum"
[(1,'H'),(2,'e'),(3,'l'),(4,'l'),(5,'o')]
zip "Hello" "ello"
[('H','e'),('e','l'),('l','l'),('l','o')]
*Main> zip "Hello" (tail "Hello")
[('H','e'),('e','l'),('l','l'),('l','o')]
太棒了 - 这正是您需要的技巧。
你需要像这样的函数
readPointsFile :: FilePath -> IO Points
readPointsFile fileName = do
....
....
return (map readPoint pointStrings)
然后你可以将它粘在一起,例如:
pathLengthFile :: FilePath -> FilePath -> IO Float
pathLengthFile pointsFilename pathFilename = do
points <- readPointsFile pointsFilename
path <- readPathFile pathFilename
return (getPathLength points path)
注意这一点中几乎没有任何逻辑。你用纯代码做所有真正的移植。
私下里,我是一个巨大的Applicative
粉丝,并且想要import Control.Applicative
并将其写成
pathLengthFile pointsFile pathFile =
getPathLength <$> readPointsFile pointsFile <*> readPathFile pathFile
但那是以后的另一课。 :)
关于haskell - 如何从我的函数中计算总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014607/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!