虽然我在Haskell示例代码中看到了各种奇怪的东西 - 我从未见过运算符加上过载.它有什么特别之处吗?
假设我有类似Pair的类型,我希望有类似的东西
Pair(2,4) + Pair(1,2) = Pair(3,6)
Run Code Online (Sandbox Code Playgroud)
可以一个人在哈斯克尔做吗?
我只是很好奇,因为我知道Scala可以以一种相当优雅的方式.
在Haskell中写这个Scala矩阵乘法的冗长讨论后,我想知道......类型安全矩阵乘法会是什么样的?所以这是你的挑战:要么链接到Haskell实现,要么自己实现,如下:
data Matrix ... = ...
matrixMult :: Matrix ... -> Matrix ... -> Matrix ...
matrixMult ... = ...
Run Code Online (Sandbox Code Playgroud)
当matrixMult产生一个错误类型在编译的时候,如果你试图乘两个matricies不兼容的尺寸.布朗尼指出,如果你链接到讨论这个精确主题的论文或书籍,和/或讨论自己这个功能是多么有用/无用.
我想在我的代码中使用Prelude.map和Data.Map.map用于不同的目的,但合格的导入Data.Map似乎没有帮助:
Prelude> import Data.Map as M
Prelude M> map
<interactive>:3:1:
Ambiguous occurrence ‘map’
It could refer to either ‘M.map’
imported from ‘Data.Map’
(and originally defined in ‘containers-0.5.0.0:Data.Map.Base’)
or ‘Prelude.map’
imported from ‘Prelude’ (and originally defined in ‘GHC.Base’)
Run Code Online (Sandbox Code Playgroud)
我希望能够分别使用map和M.map; 我怎样才能做到这一点?
我将在这里使用 C++ 作为示例来展示我所追求的内容。对于复数算术,它具有复数类型和虚数类型:
https://en.cppreference.com/w/c/language/arithmetic_types#Imaginary_floating_types
这些例如具有这样的属性:将两个数字与双虚数类型相乘将具有双精度类型。这与使用实部为 0.0 的复数几乎但不完全相同,但又不完全相同。虚数类型不会显式存储实部,这会自动消除不需要的计算和 0.0 的存储。
此外,它还可以防止带符号零的一些问题。例如,如果 a 和 b 为负,则 (0.0+i*a)*(0.0+i*b) 计算结果为 (-a*bi*0.0),否则为 (-a*b+i*0.0)。如果将结果输入到具有分支切割的函数中,这可能会令人惊讶。虚数类型避免了这种不必要的零否定。
我的问题是你能在 Haskell 中定义一个类似的虚数类型(除了复杂类型之外)以及操作(+), (-), (*), 和(/)for 它,这样它们的行为就像在 C++ 中一样?看来至少在Num和Fractional类的当前定义中这是不可能的,因为(+), (-), (*), 和(/)具有a -> a -> a类型签名,因此例如两个虚数相乘不能得到不同的类型。然而,是否可以对这些类有不同的定义,以便我所追求的目标成为可能?
我问这个并不是为了实际目的。我只是想更好地了解 Haskell 类型系统的功能。
如果我想使用readFilefrom Data.Text.IO,但是readFilePrelude中已经存在,我该如何导入它,这样就不会导致歧义错误?
我有一个脚本,只是说import Data.Text.IO,然后使用readFile,我正在ghci使用:load它测试它,但它抱怨模糊的函数调用.