如何使用 Haskell 库 Linear 缩放矢量?
How do you scale a vector using the Haskell library, Linear?
这是一个关于风格的简单问题。我一直在使用:
import Linear
point = V3 1 2 3
scaled = fmap (* 2) point
或者...
scaled = (* 2) <$> point
这是预期的方式,还是标量运算符的正确乘法?
linear
库导出了 Num a => Num (V3 a)
的一个实例,所以你实际上可以做
> point * 2
V3 2 4 6
如果你使用 GHCi,你可以看到它对 2 :: V3 Int
意味着什么:
> 2 :: V3 Int
V3 2 2 2
所以 V3
的 fromInteger
的实现看起来像
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
并没有错,只是不如使用普通算术运算符可读。大多数 Haskeller 阅读它不会有任何问题,不过,fmap
是一个非常通用的工具,几乎适用于所有类型。
这是一个关于风格的简单问题。我一直在使用:
import Linear
point = V3 1 2 3
scaled = fmap (* 2) point
或者...
scaled = (* 2) <$> point
这是预期的方式,还是标量运算符的正确乘法?
linear
库导出了 Num a => Num (V3 a)
的一个实例,所以你实际上可以做
> point * 2
V3 2 4 6
如果你使用 GHCi,你可以看到它对 2 :: V3 Int
意味着什么:
> 2 :: V3 Int
V3 2 2 2
所以 V3
的 fromInteger
的实现看起来像
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
并没有错,只是不如使用普通算术运算符可读。大多数 Haskeller 阅读它不会有任何问题,不过,fmap
是一个非常通用的工具,几乎适用于所有类型。