【发布时间】:2011-02-27 03:25:21
【问题描述】:
在Monads for natural language semantics 中,Chung-Chieh Shan 展示了如何使用单子对一些不同类型的自然语言现象(疑问句、焦点、内涵和量化)的标准描述进行很好的统一重述。他定义了两个组合操作,A_M 和 A'_M,它们对此很有用。
第一个只是ap。在powerset monad中ap是非确定性函数应用,对于处理疑问句的语义很有用;在 reader monad 中,它对应于通常的外延组合分析;等等
这是有道理的。然而,二级合成操作的类型签名对我来说看起来很奇怪:
(<?>) :: (Monad m) => m (m a -> b) -> m a -> m b
(Shan 称它为A'_M,但我在这里称它为<?>。)定义是您对类型的期望;它与ap 非常接近:
g <?> x = g >>= \h -> return $ h x
我想我可以理解这在论文的上下文中是如何做到的(处理疑问句的提问动词,用作内涵组合等)。它的作用并不是很复杂,但看到它在这里扮演如此重要的角色有点奇怪,因为它不是我以前在 Haskell 中看到的一个习语。
对于 m (m a -> b) -> m a -> m b 或 m (a -> b) -> a -> m b,Hoogle 上没有任何有用的信息。
这对于其他背景的人来说是不是很熟悉?你写过这个函数吗?
【问题讨论】:
-
我一时糊涂了,因为我实际上写了一个不相关的
(<?>)组合子,如liftA2 (\b t e -> if b then t else e)。
标签: haskell types monads semantics