1

嗨,我正在尝试使用 foldl 函数将元组列表加到一个元组中,我尝试使用 lambda 表达式作为参数,但它在代码中给出了错误的值:

data Point = Point {x,y :: Float}
sumPoint :: [Point] -> (Float,Float)
sumPoint xs = foldl (\(a,b) x-> (0+a,0+b)) (0.0,0.0) xs

它应该出来sumPoint [Point 2 4, Point 1 2, Point (-1) (-2)] = (2.0,4.0) 但我得到了(0.0,0.0) 这有什么意义?

4

2 回答 2

3

为了有点结构化,您最好在Point类型值之间定义操作,然后Point在需要的地方将类型转换为元组。否则你可以直接使用 Tuple 并丢弃Point类型。

data Point = Point {x,y :: Float} deriving Show

toTuple :: Point -> (Float, Float)
toTuple p = (x p, y p)

addPts :: Point -> Point -> Point
addPts p q = Point (x p + x q) (y p + y q)

sumPts :: [Point] -> Point
sumPts = foldl addPts (Point 0 0)

所以你需要的是toTuple . sumPts功能。

*Main> :t toTuple . sumPts
toTuple . sumPts :: [Point] -> (Float, Float)
于 2019-11-14T09:12:05.863 回答
2

我把它改成

sumPoint xs = foldl (\(a,b) (Point x y)-> (x+a,y+b)) (0.0,0.0) xs

问题是我忽略了 x 并且在 0+a 处没有发生任何事情。

于 2019-11-14T09:06:54.910 回答