Haskell中的过载角括号作为内积运算符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell中的过载角括号作为内积运算符相关的知识,希望对你有一定的参考价值。

我想知道我是否可以将尖括号'<'和'>'重载为:

data Vec a = Vec [Integer] deriving Show
let u = Vec [1, 2, 3]
let v = Vec [2, 4, 5]

<u, v> = inner product of u and v 

我知道我可以像运算符一样重载'<&>':

Vec u <&> Vec v = Vec $ zipWith(x y -> x*y) u v
答案

不,你真的不能这样做。 Haskell不是Agda。 Haskell只识别()[]{}括号。 ()仅用于元组类型和分组。 {}用于各种语法目的,没有一个你可以控制。 []通常用于列表。您可以使用OverloadedLists和/或MonadComprehensions来影响列表语法的解释方式,但仅限于与您请求的内容无关的有限方式。没有办法说服Haskell <>是括号。您可能会做的唯一想法是使用Template Haskell处理您自己的语法,但这将增加其自身的额外语法开销。

以上是关于Haskell中的过载角括号作为内积运算符的主要内容,如果未能解决你的问题,请参考以下文章

学习惯用 Haskell 的资源(eta 缩减、符号中缀运算符、库等)[关闭]

如何理解这段代码片段中的两对括号?

Haskell GLUT 库中的 ($=)(美元等于)运算符有啥作用?

Haskell 布尔表达式:解析错误(可能不正确的缩进或不匹配的括号)

Haskell中的幂运算

运算符重载模函数