我试图在Haskell中设计嵌入式语言,如果可能的话,我想给并置提供一个自定义的含义,通常表示函数应用。 或者,几乎等效地,我想定义一个空格操作符,它具有正常的可定义运算符优先级。
像
这样的东西( ) x y = x * y
然后允许将乘法3 * 4
写为3 4
。
GHC中是否有任何方法(使用任何必要的扩展名)来实现此目的?
答案 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中的符号0
,1
等被重载 - 0 :: Num a => a
- 它们可以表示具有Num
实例的任何内容。因此,通过为函数Num
定义Num a => a -> a
实例,我们现在拥有3 :: Num a => a -> a