有没有办法在ghc中重载并置?

时间:2015-01-03 12:33:57

标签: haskell operator-overloading ghc

我试图在Haskell中设计嵌入式语言,如果可能的话,我想给并置提供一个自定义的含义,通常表示函数应用。 或者,几乎等效地,我想定义一个空格操作符,它具有正常的可定义运算符优先级。

这样的东西
( ) x y = x * y

然后允许将乘法3 * 4写为3 4

GHC中是否有任何方法(使用任何必要的扩展名)来实现此目的?

1 个答案:

答案 0 :(得分:5)

实际上,是的!

{-# LANGUAGE FlexibleInstances #-}
module Temp where

instance Num a => Num (a -> a) where
  fromInteger n = (fromInteger n *)
  n + m = \x -> n x + m x
  -- ...

然后在ghci:

λ :l Temp
...
λ 3 (4 :: Int) :: Int
12
λ let _4 = 4 :: Int
λ 3 _4 :: Int
12
λ (3 + 4) (2 :: Int) :: Int
14

Haskell中的符号01等被重载 - 0 :: Num a => a - 它们可以表示具有Num实例的任何内容。因此,通过为函数Num定义Num a => a -> a实例,我们现在拥有3 :: Num a => a -> a