【问题标题】:How do you scale a vector using the Haskell library, Linear?如何使用 Haskell 库 Linear 缩放矢量?
【发布时间】:2015-01-12 16:05:54
【问题描述】:

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

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

或者……

scaled = (* 2) <$> point

这是预期的方式,还是标量运算符的正确乘法?

【问题讨论】:

标签: haskell haskell-linear


【解决方案1】:

linear 库导出了一个 Num a =&gt; Num (V3 a) 的实例,因此您实际上可以这样做

> point * 2
V3 2 4 6

如果你使用 GHCi,你可以看到它对2 :: V3 Int 意味着什么:

> 2 :: V3 Int
V3 2 2 2

所以fromIntegerV3 的实现看起来像

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 -&gt; b 类型的函数应用于V3 a 以获得V3 b,而对输出类型没有任何限制(必须如此)。使用fmap 并没有错,只是它的可读性不如使用普通算术运算符。大多数 Haskellers 阅读它不会有任何问题,不过,fmap 是一个非常通用的工具,几乎适用于所有类型。

【讨论】:

  • 哦。好尴尬,没想到类型这么灵活,一直在找“缩放”功能。这是完全有道理的。谢谢。
  • @Viclib: 嗯...它有些有道理,但并不是真正的“完全有道理”。 Num 实例在数学上相当冒险。当然,Edward 知道他在做什么,但我仍然推荐vector-space package 以获得更好的界面。缩放用*^ 表示。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多