5

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

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

或者...

scaled = (* 2) <$> point

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

4

1 回答 1

8

linear库导出 的实例Num a => Num (V3 a),因此您实际上可以这样做

> point * 2
V3 2 4 6

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

> 2 :: V3 Int
V3 2 2 2

所以 for 的实现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了,所以你应该能够使用/和合作。当您的观点包含Fractional价值时。不过,使用的fmap比较一般,可以将你的转换V3 IntV3 String,例如:

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

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

于 2015-01-12T16:18:42.980 回答