代码之家  ›  专栏  ›  技术社区  ›  niklasfi Rahul Tripathi

是否有一种强类型编程语言允许您定义新的运算符?

  •  7
  • niklasfi Rahul Tripathi  · 技术社区  · 17 年前

    我目前正在寻找一种编程语言来编写数学课程。我知道到处都有很多,但由于我下学期要开始学习数学,我想这可能是一个更好的方法,可以让我对所学内容有更深的了解。

    谢谢你的回复。

    顺便说一句:如果你想知道我想问什么:

    “是否有允许您定义新运算符的强类型编程语言?”

    13 回复  |  直到 17 年前
        1
  •  19
  •   Community Mohan Dere    9 年前

    Like EFraim said ,Haskell使这变得非常简单:

    % ghci
    ghci> let a *-* b = (a*a) - (b*b)
    ghci> :type (*-*)
    (*-*) :: (Num a) => a -> a -> a
    ghci> 4 *-* 3
    7
    ghci> 1.2 *-* 0.9
    0.6299999999999999
    ghci> (*-*) 5 3
    16
    ghci> :{
              let gcd a b | a > b     = gcd (a - b) b 
                          | b > a     = gcd a (b - a) 
                          | otherwise = a
          :}
    ghci> :type gcd
    gcd :: (Ord a, Num a) => a -> a -> a
    ghci> gcd 3 6
    3
    ghci> gcd 12 11
    1
    ghci> 18 `gcd` 12
    6
    

    可以使用中缀语法定义新的中缀运算符(仅限符号)。然后您可以使用 将它们作为中缀运算符使用,或将它们括在paren中以将其用作正规函数。

        2
  •  10
  •   Joey Gumbo    17 年前

    你可以用多种语言重新定义一组固定的操作符,比如 C++ 或 C# . 其他人,比如 F# 或 Scala 允许您定义甚至新的运算符(甚至是中缀运算符),这对于math-y内容可能更好。

        3
  •  9
  •   EFraim    17 年前

        4
  •  8
  •   skaffman    17 年前

    Ted Neward针对Java开发人员写了一系列关于Scala的文章,最后他演示了如何用Scala编写数学领域语言(顺便说一句,Scala是一种静态类型语言)

    Part 1

    Part 2

    Part 3

        5
  •  3
  •   Gordon Gustafson    17 年前

    在C++中,您可以定义在其他类上工作的操作符,但我不认为像Int这样的其他基本类型,因为它们不能有实例方法。您可以在C++中创建自己的数字类,并重新定义所有运算符,包括+*等。

    要在原语类型上创建新的运算符,您必须求助于函数式编程(从其他答案看来)。这很好,只要记住函数式编程与面向对象编程非常不同。但这将是一个巨大的新挑战,函数式编程对数学来说非常重要,因为它来自lambda calc。学习函数式编程将教给你不同的技能,并对你的数学和编程有很大帮助D

        6
  •  2
  •   clemahieu    17 年前

    Eiffel允许您定义新的运算符。

    http://dev.eiffel.com

        7
  •  2
  •   Nietzche-jou    17 年前

    由于在Lisp组合中应用于参数的过程被称为运算符,那么是的,您可以定义新的运算符,直到奶牛回家。

        8
  •  2
  •   Community Mohan Dere    6 年前

    reference manual chapter .

    不幸的是,您无法创建自己的新运算符,似乎只能覆盖现有运算符。

    type wobble is new integer range 23..89;
    
    function "+" (A, B: wobble) return wobble is
    begin
       ...
    end "+";
    

    不得不说,Ada不是一种非常流行的语言,但就强大的打字能力而言,你不可能变得更强大。

    另一种尚未提及的语言是 D . 它也是一种强类型语言,支持 operator overloading . 同样,它不支持用户定义的中缀运算符。

    从 http://www.digitalmars.com/d/1.0/rationale.html

    这些对于将新的中缀操作附加到各种unicode符号非常有用。问题是在D中,标记应该完全独立于语义分析。用户可定义的运算符将打破这一点。

        9
  •  2
  •   Community Mohan Dere    9 年前
        10
  •  1
  •   Jørgen Fogh    17 年前

    我认为您可能应该深入思考为什么要使用此功能。在我看来,在选择一门语言时,有很多更重要的考虑因素。

    在这个上下文中,我只能想到单词“operator”的一个可能的含义,它只是函数调用的语法糖,例如。 foo + bar 将转换为对函数的调用 +(a, b) .

    这有时很有用,但并不经常。我能想到很少有我重载/定义运算符的实例。

    如其他答案所述,Haskell确实允许您定义新的中缀运算符。然而,一个纯粹的函数式语言加上懒惰的计算可能会有点吃力。如果您想第一次尝试函数式语言,我可能会推荐SML而不是Haskell。类型系统稍微简单一点,可以使用副作用,而且不懒惰。

    units of measure ,这是该语言所独有的。如果您需要该功能,它将是无价的。

    我脑子里想不出任何带有中缀运算符的静态类型命令式语言,但你可能想在数学编程中使用函数式语言,因为证明函数式程序的事实要容易得多。

    如果中缀运算符等语法问题对您非常重要,您可能还希望创建一个小型DSL。然后你可以用你想要的任何语言编写程序,并且仍然可以用一种方便的方式指定数学。

        11
  •  1
  •   David Thornley    17 年前

    你说的强打字是什么意思?您指的是静态类型(所有内容都有一个在编译时已知的类型,并且转换受到限制)还是强类型(所有内容都有一个在运行时已知的类型,并且转换受到限制)?

    (+ a b) ),而是可以自由定义的函数。它具有很强的类型性,因为每个对象都有一个确定的类型,即使在编译时无法知道它,并且转换受到限制。这是一种非常适合探索性编程的语言,听上去这就是您要做的。

        12
  •  1
  •   Stefan Monov    17 年前

    Ruby does.

    require 'rubygems'
    require 'superators'
    
    class Array
      superator "<---" do |operand|
        self << operand.reverse
      end
    end
    
    ["jay"] <--- "spillihp"
    
        13
  •  0
  •   Alex    17 年前

    实际上,通过运算符重载,您可以使用C#执行所需的操作。

     public static Complex operator -(Complex c)
     {
        Complex temp = new Complex();
        temp.x = -c.x;
        temp.y = -c.y;
        return temp;
     }