私はREPLで遊ぶのが大好きです。新しいものを試してみるという、とても簡単で簡単な方法です。ご存知のように、ある種の言語は、モジュール内ではなくREPL内で異なって実行されます。複数行の定義がその中の一つです。REPLでは固定性宣言を定義できますか?
今、REPLで演算子の固定を宣言できるかどうか、その場合はどうすればいいのでしょうか。素朴な試み...驚き...うまくいきません。
Prelude> let (f · g) x = f(g(x))
Prelude> infixl 7 ·
私はREPLで遊ぶのが大好きです。新しいものを試してみるという、とても簡単で簡単な方法です。ご存知のように、ある種の言語は、モジュール内ではなくREPL内で異なって実行されます。複数行の定義がその中の一つです。REPLでは固定性宣言を定義できますか?
今、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 &&
私のghciでは ' - Defined at'行の下に表示されます。 –
確かに、固定性はghci-7.6では表示されますが、ghci-7.4では表示されません。 – leftaroundabout
これは型ファミリの型演算子では機能しません。 – CMCDragonkai
プロンプトで定義したものについては、 'let infixl 7 /&/; f /&/ g = \ x - > f(g x) 'である。他の場所で定義されたものに対する固定宣言は、afaikにはできません。 –