如何使用Haskell库,Linear来缩放矢量?

时间:2015-01-12 16:05:54

标签: haskell linear

这是一个关于风格的简单问题。我一直在使用:

import Linear
point  = V3 1 2 3
scaled = fmap (* 2) point

或者...

scaled = (* 2) <$> point

这是预期的方式,还是由标量运算符进行适当的乘法?

1 个答案:

答案 0 :(得分:7)

linear库导出Num a => Num (V3 a)的实例,所以你实际上可以做到

> point * 2
V3 2 4 6

如果您使用GHCi,您可以看到它对2 :: V3 Int的含义:

> 2 :: V3 Int
V3 2 2 2

因此fromInteger V3的实现看起来像

fromInteger n = V3 n' n' n' where n' = fromInteger n

这意味着您可以执行

之类的操作
> point + 2
V3 3 4 5
> point - 2
V3 (-1) 0 1
> abs point
V3 1 2 3
> signum point
V3 1 1 1
> negate point
V3 (-1) (-2) (-3)

V3也实现了Fractional,因此您应该可以使用/和co。当您的点包含Fractional值时但是,fmap的使用更为通用,您可以将V3 Int转换为V3 String,例如:

> fmap show point
V3 "1" "2" "3"

fmap函数允许您将a -> b类型的函数应用于V3 a以获得V3 b,而不会对输出类型进行任何限制(必然如此)。使用fmap没有错,它只是不像使用普通的算术运算符那样可读。但是,大多数Haskellers在阅读它时都没有任何问题,fmap是一个非常通用的工具,可以显示几乎所有类型。