一种不寻常的签名

Tra*_*own 3 monads haskell types semantics

Monads中,对于自然语言语义学,Chung-Chieh Shan展示了如何使用monad来对一些不同类型的自然语言现象(疑问,焦点,内涵和量化)的标准叙述进行非常均匀的重述.他定义了两个组合操作,A_M并且A'_M对此有用.

第一个是简单的ap.在powerset中monad ap是非确定性函数应用程序,它对于处理疑问句的语义很有用; 在读者monad中,它对应于拉伸成分的通常分析; 等等

这是有道理的.但是,辅助合成操作的类型签名对我来说很奇怪:

(<?>) :: (Monad m) => m (m a -> b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)

(Shan称之为A'_M,但我会<?>在这里称之为.)定义是你对类型的期望; 它非常接近ap:

g <?> x = g >>= \h -> return $ h x
Run Code Online (Sandbox Code Playgroud)

我想我可以理解这是如何在论文的背景下做到的(处理疑问句的问题动词,作为内容构成等).它的作用并不是非常复杂,但看到它在这里扮演如此重要的角色有点奇怪,因为它不是我之前在Haskell中看到的成语.

Hoogle没有任何有用的东西m (m a -> b) -> m a -> m b或者m (a -> b) -> a -> m b.

这看起来对其他任何人来说都很熟悉吗?你有没有写过这个功能?

C. *_*ann 6

它看起来很奇怪的(m a -> b)部分原因可能是部分 - 这实际上是对给定实现推断的最多态类型的限制,并且脱离上下文对于monad来说是荒谬的.最常见的类型如下所示:

> :t (\g x -> g >>= \h -> return $ h x)
(\g x -> g >>= \h -> return $ h x) :: (Monad m) => m (t -> a) -> t -> m a
Run Code Online (Sandbox Code Playgroud)

可以在不使用monad的情况下编写更通用的版本:

a'_F :: (Functor f) => f (a -> b) -> a -> f b
a'_F g x = fmap ($ x) g
Run Code Online (Sandbox Code Playgroud)

它在这里似乎没有相关性,但f a -> b类似的类型确实类似于comonad上的cobind操作的第二个参数:

(=>>) :: (Comonad w) => w a -> (w a -> b) -> w b
Run Code Online (Sandbox Code Playgroud)