0
. :: (a -> b) -> (c -> a) -> c -> b
f . g = \ x -> f (g x)
なぜこの定義は違法ですか?審美的な選択、または正式な必要性?タイプシグニチャーのオペレーターシンボルのまわりのかぎ括弧
. :: (a -> b) -> (c -> a) -> c -> b
f . g = \ x -> f (g x)
なぜこの定義は違法ですか?審美的な選択、または正式な必要性?タイプシグニチャーのオペレーターシンボルのまわりのかぎ括弧
これは一貫性のためです。中置演算子自体は、の式では定義できません。以下は法的ではありません。
. = \f g x -> f (g x)
...これは基本的にあなたの定義に委ねられていません。しかし、直接はこのよう中置の値を定義するために、我々はまず、特殊な構文上の地位を無効にする必要があり、その括弧でそれをラップすることにより行われています:
(.) :: (a -> b) -> (c -> a) -> c -> b
(.) = \f g x -> f (g x)
これは
の定義と全く同じですcompose :: (a -> b) -> (c -> a) -> c -> b
compose = \f g x -> f (g x)
Prelude> map (toEnum `compose` round) $ [110 + sin x * 12 | x<-[0..30]] :: String
"nxypebkvzsgbhszvkbepyxndclwyqfb"
のような、その後も中置として使用することができます
...、しかし、あなたは明らかにINFI内の定義を記述しないだろう
`compose` :: (a -> b) -> (c -> a) -> c -> b
`compose` = \f g x -> f (g x)
のようなX形、...あなたは
f`compose`g = \x -> f (g x)
を行うことができても、私は絶対にそのロジックに従うことができます。しかし、 '= 'の左側に拡張されたバックティック記法と記号演算子中置の組み合わせは、正式な一貫性のために十分ではないでしょうか?例はまだ法的になります。 '((((+ 2))))3 == 5 'となる。 '。 g = \ f x - > f(g x) 'は'(。(+1))(+ 2)4'と同様に動作します。シンボル演算子がすでにHaskellの規則的なポーランド表記法の例外である場合、宣言/名前のバインディングにもこの例外を使用しないでください。 – suchtgott
'add :: Num a =>(a) - >(a) - >(a)'と '(add)a b = a + b'も完全に合法です。私は、宣言での不正行為の違法性のような例外は不必要に混乱していると思います。 – suchtgott
@GeorgJohannSchubert構文の例外が悪いので、(通常)すべてのコストをかけて回避します。パターンと式の構文は非常に類似していることに注意してください。パターンには基本的に式構文(ViewPatternsなど)と、各変数が多くても一度しか表示されない追加の制約があります。このような例外は、パターンと式構文の間に矛盾を引き起こします。 – user2407038