【问题标题】:An unusual type signature不寻常的类型签名
【发布时间】:2011-02-27 03:25:21
【问题描述】:

Monads for natural language semantics 中,Chung-Chieh Shan 展示了如何使用单子对一些不同类型的自然语言现象(疑问句、焦点、内涵和量化)的标准描述进行很好的统一重述。他定义了两个组合操作,A_MA'_M,它们对此很有用。

第一个只是ap。在powerset monad中ap是非确定性函数应用,对于处理疑问句的语义很有用;在 reader monad 中,它对应于通常的外延组合分析;等等

这是有道理的。然而,二级合成操作的类型签名对我来说看起来很奇怪:

(<?>) :: (Monad m) => m (m a -> b) -> m a -> m b

(Shan 称它为A'_M,但我在这里称它为&lt;?&gt;。)定义是您对类型的期望;它与ap 非常接近:

g <?> x = g >>= \h -> return $ h x

我想我可以理解这在论文的上下文中是如何做到的(处理疑问句的提问动词,用作内涵组合等)。它的作用并不是很复杂,但看到它在这里扮演如此重要的角色有点奇怪,因为它不是我以前在 Haskell 中看到的一个习语。

对于 m (m a -&gt; b) -&gt; m a -&gt; m bm (a -&gt; b) -&gt; a -&gt; m b,Hoogle 上没有任何有用的信息。

这对于其他背景的人来说是不是很熟悉?你写过这个函数吗?

【问题讨论】:

  • 我一时糊涂了,因为我实际上写了一个不相关的(&lt;?&gt;)组合子,如liftA2 (\b t e -&gt; if b then t else e)

标签: haskell types monads semantics


【解决方案1】:

只是在ghci中玩,我尝试了以下内容:

> [length, sum, maximum, minimum, const 666] <?> [1, 2, 3]
[3, 6, 3, 1, 666]

> Nothing <?> Nothing
Nothing
> Just (maybe 0 (^2)) <?> Just 7
49
> Just (maybe 0 (^2)) <?> Nothing
0

> :m + Control.Monad.Instances

> (((+2) >>=) <?> 3) (^) -- (3+2)^3
125
> (((+2) .) <?> 3) (^4) -- (3^4)+2
83
> ((. (+2)) <?> 3) (^4) -- (3+2)^4
625

我想我实际上已经写了这个列表的特定版本。在所有这些示例中,我发现列表版本对一般情况最有启发性。

【讨论】:

    【解决方案2】:

    它看起来很奇怪的部分原因可能是(m a -&gt; b) 部分——这实际上是对给定实现推断出的最多态类型的限制,并且脱离上下文对于单子来说是荒谬的。最一般的类型是这样的:

    > :t (\g x -> g >>= \h -> return $ h x)
    (\g x -> g >>= \h -> return $ h x) :: (Monad m) => m (t -> a) -> t -> m a
    

    完全不使用 monad 也可以编写更通用的版本:

    a'_F :: (Functor f) => f (a -> b) -> a -> f b
    a'_F g x = fmap ($ x) g
    

    这里似乎无关紧要,但是像f a -&gt; b 这样的类型确实类似于comonad 上的cobind 操作的第二个参数:

    (=>>) :: (Comonad w) => w a -> (w a -> b) -> w b
    

    【讨论】:

    【解决方案3】:

    这让我想起了loeb function

    > loeb :: Functor a => a (a x -> x) -> a x
    > loeb x = fmap (\a -> a (loeb x)) x
    

    loeb 打结。这意味着如果a 是某种容器,loeb 会根据规则容器创建容器,说明如何根据最终结果创建每个元素。

    &lt;?&gt; 类似,但不是将规则应用于自己的最终结果,而是将规则应用于另一个容器,因此不再是循环的。

    【讨论】:

    • 是的,是loeb f = fix (f ??)?
    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多