类型签名中的运算符符号周围的括号

时间:2017-03-16 18:58:00

标签: haskell syntax operators special-characters type-signature

. :: (a -> b) -> (c -> a) -> c -> b
f . g = \ x -> f (g x)

为什么这个定义是非法的?审美选择还是形式上的必然性?

1 个答案:

答案 0 :(得分:6)

这是为了保持一致性。中缀运算符本身不是表达式,您可以定义其类型或值。以下内容也不合法:

. = \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"

但你显然不会用中缀形式写定义,比如

`compose` :: (a -> b) -> (c -> a) -> c -> b
`compose` = \f g x -> f (g x)

......虽然你可以做到

f`compose`g = \x -> f (g x)