代码之家  ›  专栏  ›  技术社区  ›  Travis Brown

一个不寻常的类型签名

  •  3
  • Travis Brown  · 技术社区  · 16 年前

    Monads for natural language semantics 钟建山(Chung Chieh-shan)展示了如何使用单子对某些不同类型的自然语言现象(疑问、焦点、强度和量化)的标准描述进行很好的统一重述。他定义了两个合成操作, A_M A'_M ,对于这个目的是有用的。

    第一个很简单 ap . 在Powerset Monad中 AP 是一个非确定性的函数应用程序,它对处理疑问句的语义很有用;在阅读器monad中,它对应于通常的扩展成分分析等。

    这是有道理的。但是,二次组合操作的类型签名在我看来很奇怪:

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

    (山称之为 “嗯” ,但我会叫它 <?> 这里)定义是您期望从类型中得到的;它与 AP :

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

    我想我能理解这是怎么做的,在论文的背景下(处理疑问句的动词问句,充当内涵成分等)。它所做的并不十分复杂,但在这里它扮演着如此重要的角色有点奇怪,因为它不是我以前在哈斯克尔见过的习语。

    也没什么有用的。 m (m a -> b) -> m a -> m b m (a -> b) -> a -> m b .

    对于其他环境中的任何人来说,这看起来熟悉吗?你写过这个函数吗?

    3 回复  |  直到 16 年前
        1
  •  6
  •   C. A. McCann Ravikant Cherukuri    16 年前

    看起来很奇怪的部分原因可能是 (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
    

    更一般的版本可以不使用monads编写:

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

    它在这里似乎不相关,但是像 f a -> b 与Comonad上cobind操作的第二个参数类似:

    (=>>) :: (Comonad w) => w a -> (w a -> b) -> w b
    
        2
  •  4
  •   sepp2k    16 年前

    我只是在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
    

    我想我已经写了这个列表的具体版本。在所有这些例子中,我发现列表版本对一般情况最有启发性。

        3
  •  1
  •   sigfpe    16 年前

    这让我想起 loeb function :

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

    洛布 领结。这意味着如果 a 是某种容器, 洛布 从一个规则容器中生成一个容器,说明如何从最终结果中生成每个元素。

    <?> 与此类似,但它不会将规则应用于自己的最终结果,而是将规则应用于另一个容器,因此不再是循环的。

    推荐文章