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

Chi*_*nke 3 haskell operator-overloading ghc

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

就像是

( ) x y = x * y
Run Code Online (Sandbox Code Playgroud)

那么这将允许写乘法3 * 43 4.

GHC中是否有任何方法(使用任何必要的扩展)来实现这一点?

ram*_*ion 5

其实,是!

{-# LANGUAGE FlexibleInstances #-}
module Temp where

instance Num a => Num (a -> a) where
  fromInteger n = (fromInteger n *)
  n + m = \x -> n x + m x
  -- ...
Run Code Online (Sandbox Code Playgroud)

然后在ghci:

? :l Temp
...
? 3 (4 :: Int) :: Int
12
? let _4 = 4 :: Int
? 3 _4 :: Int
12
? (3 + 4) (2 :: Int) :: Int
14
Run Code Online (Sandbox Code Playgroud)

符号0,1等在Haskell超载- 0 :: Num a => a-他们可以代表任何东西,有一个Num实例.因此,通过定义Num函数的实例Num a => a -> a,我们现在有了3 :: Num a => a -> a