2015-01-03 2 views
3

Я пытаюсь создать встроенный язык в Haskell, и, если возможно, я хотел бы дать настраиваемое значение для сопоставления, которое обычно обозначает приложение функции. Или, почти эквивалентно, я хотел бы определить оператор пробела, который имеет нормальный определяемый приоритет оператора.Есть ли способ перегрузить сопоставление в ghc?

Что-то вроде

() x y = x * y 

, который позволит затем записать умножение 3 * 4 в 3 4.

Есть ли какой-либо способ в GHC (с использованием любого расширения) для его реализации?

+2

Это было бы хорошо, но как бы вы применили обычные функции? –

+0

Он должен быть перегружен только для определенных типов, например (в моем примере) два числа. –

+1

Он не будет работать вместе с типом вывода. –

ответ

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 

Символы 0, 1 и т.д. в Haskell перегружены - 0 :: Num a => a - они могут представлять собой все, что имеет Num экземпляр. Поэтому, определив пример Num для функций Num a => a -> a, теперь у нас есть 3 :: Num a => a -> a

+1

'3 (4 :: Int) :: Int' вряд ли выигрывает над' 3 * 4'. –

+0

Можно ли сделать эту работу без явного указания результата на 'Int', как это делается в' 3 _4 :: Int'? –

+0

Аннотации типа необходимы только для ghci. В исходном файле вы можете иметь «двенадцать :: Int» 'двенадцать = 3 4' – phadej

Смежные вопросы