2017-03-17 31 views
1

对于两个点之间的距离,在不更改函数声明的情况下,我一直收到此错误“与预期类型'b'不符合实际类型'a' 'a'是一个刚性类型变量,由 “两点距离,Haskell不改变函数声明?

type Point a = (a,a) 
distance :: (Real a, Floating b) => Point a -> Point a -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = x2 - x1 
    dy = y2 - y1 
+0

你尝试过申请'realToFrac'到'sqrt'结果的具体原因是什么? – jakubdaniel

回答

2

sqrt返回相同类型作为参数:签字

Prelude> :t sqrt 
sqrt :: Floating a => a -> a 

既然你提供b作为参数传递给sqrt,哈斯克尔推断返回类型必须是b而不是a

有你为什么不能使用

distance :: Floating b => Point b -> Point b -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = x2 - x1 
     dy = y2 - y1 
+0

这是需要在我的任务,我不应该改变功能标题,因为我们应该使用测试仪提供给我们 – Sal

+0

@Sal你可以很容易地包装这个功能来实现原始签名,因为你可以转换'只要有'真实a'和'小数b',就指向a点到b点。 – leftaroundabout

0
type Point a = (a,a) 
distance :: (Real a, Floating b) => Point a -> Point a -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = realToFrac $ x2 - x1 
     dy = realToFrac $ y2 - y1 
+1

这是现在正确的解决方案,但国际海事组织“这里有工作守则”的答案对作业问题并不是很好。 – leftaroundabout

+0

它不是我正在寻找的确切答案,而这只是一个较大项目中的一个小函数 – Sal