在Monads for natural language semantics中,Chung-Chieh Shan 展示了如何使用 monad 对一些不同类型的自然语言现象(疑问句、焦点、内涵和量化)的标准描述进行很好的统一重述。他定义了两个可用于此目的的合成操作A_M
和。A'_M
第一个很简单ap
。在 powerset monadap
中是非确定性函数应用程序,这对于处理疑问句的语义很有用;在 reader monad 中,它对应于通常的外延组合分析;等等
这是有道理的。然而,辅助组合操作的类型签名对我来说看起来很奇怪:
(<?>) :: (Monad m) => m (m a -> b) -> m a -> m b
(Shan 称它为A'_M
,但我会<?>
在这里称它。)定义是您对类型的期望;它非常接近于ap
:
g <?> x = g >>= \h -> return $ h x
我想我可以理解这在论文的上下文中是如何做到的(处理疑问句的提问动词,用作内涵组合等)。它所做的并不是非常复杂,但是看到它在这里扮演如此重要的角色有点奇怪,因为它不是我以前在 Haskell 中看到的习语。
Hoogle 上没有任何有用的信息用于m (m a -> b) -> m a -> m b
或m (a -> b) -> a -> m b
。
其他情况下的任何人都觉得这很熟悉吗?你写过这个函数吗?