问题描述
我有一个结构体,它代表 mx + b 形式的线的方程和一个点的结构
行{m :: Double,b :: Double}派生(Show,Eq)
Point {x :: Double,y :: Double}派生(Show ,Eq)
我希望函数垂直这样做:
vertical(Line mb)(Point xy)=
Line m2 b2其中
m2 =( - 1 / m)
b2 = y - m2 * x
if给定一条线和一个点,或者一个部分应用的线
垂直线(线mb)=
线m2其中
m2 =(-1 / m)
如果只有一条线。
这里的问题是,我得到
在第一种情况下,您希望 vertical 类型为 Line - >点 - > Line ,而在第二种情况下,您希望它的类型为 Line - >双 - >线。这表明我们可以用一个类型类来完成这个工作,我们可以抽象出第二个参数的类型:
pre code> class Perpendicular a where
perpendicular :: Line - > a - >行
您的第一个案例将成为 Point $ c $的实例
实例垂直点其中
垂直(直线mb)(点xy)=直线m2 b2
其中m2 =(-1 / m)
b2 = y - m2 * x
而第二个变为 Double的实例。
实例Perpendicular Double where
vertical(Line mb)= Line m2
其中m2 =(-1 / m)
I have a structure which represents the equation of a line in the form m x + b and a structure of a point
Line { m :: Double, b :: Double } deriving( Show, Eq ) Point { x :: Double, y :: Double } deriving( Show, Eq )
I want the function perpendicular that does the following:
perpendicular (Line m b) (Point x y) = Line m2 b2 where m2 = (-1/m) b2 = y - m2*x
if given a line and a point, or a partially applied Line
perpendicular (Line m b) = Line m2 where m2 = (-1/m)
if only given a Line.
The problem here is that I get
In the first case, you want the type of perpendicular to be Line -> Point -> Line, while in the second case you want it to have the type Line -> Double -> Line. This suggests that we can do this with a type class where we abstract over the type of the second argument:
class Perpendicular a where perpendicular :: Line -> a -> Line
Your first case then becomes an instance for Point
instance Perpendicular Point where perpendicular (Line m b) (Point x y) = Line m2 b2 where m2 = (-1/m) b2 = y - m2*x
while the second becomes an instance for Double.
instance Perpendicular Double where perpendicular (Line m b) = Line m2 where m2 = (-1/m)
这篇关于函数在Haskell中重载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!