私は REPL をいじるのが大好きです。これは、新しいことを試すための非常に迅速で簡単な方法だからです。言語の特定の側面は、ご存じのとおり、モジュール内とは対照的に REPL では異なる方法で行われます。複数行の定義もその 1 つです。
ここで、REPL で演算子の固定性を宣言できるかどうか、またその場合はどのように宣言できるかを考えます。単純な試み...驚き...うまくいきません。
Prelude> let (f · g) x = f(g(x))
Prelude> infixl 7 ·
私は REPL をいじるのが大好きです。これは、新しいことを試すための非常に迅速で簡単な方法だからです。言語の特定の側面は、ご存じのとおり、モジュール内とは対照的に REPL では異なる方法で行われます。複数行の定義もその 1 つです。
ここで、REPL で演算子の固定性を宣言できるかどうか、またその場合はどのように宣言できるかを考えます。単純な試み...驚き...うまくいきません。
Prelude> let (f · g) x = f(g(x))
Prelude> infixl 7 ·
このような複数行の定義を使用して固定性を宣言できます
>>> :{
>>> let infixl 7 ***
>>> (f *** g) (a,b) = (f a, g b)
>>> :}
>>> (negate *** show) (1,2)
(-1,"2")
編集:興味深いことに、関数についてGHCIに尋ねると、固定性は表示されません
>>> :i ***
(***) :: (a -> a') -> (b -> b') -> (a, b) -> (a', b')
-- Defined at <interactive>:10:8
に比べ
>>> :i &&
(&&) :: Bool -> Bool -> Bool -- Defined in `GHC.Classes'
infixr 3 &&