【问题标题】:What does ((->) t) mean in Haskell?((->) t) 在 Haskell 中是什么意思?
【发布时间】:2013-09-01 19:04:03
【问题描述】:

在 Haskell 中,((->) t) 在实例的类型签名中是什么意思?例如 Functor、Applicative 和 Monad 都有一个实例:

Functor ((->) r)

我找不到任何关于这种类型签名意味着什么的解释,而且它对搜索引擎有很强的抵抗力。

【问题讨论】:

  • highly search engine-resistant -- 不适用于 SO 搜索引擎。见stackoverflow.com/q/5310203/11683
  • 你是对的!我想我有时应该考虑直接搜索 SO 而不是仅仅依靠 Google。
  • 您也可以在SymbolHound上搜索。
  • 如果遇到这个问题的人想知道,一个好的搜索词是“reader monad”。

标签: haskell functional-programming


【解决方案1】:

-> 是一个中缀类型的构造函数。您可以将其与 : 进行比较 - 列表类型的中缀值构造函数。要单独使用:,我们在它周围加上括号,使它成为一个前缀函数应用程序:

(:) a ba : b 相同

同样,(->) a ba -> b 相同,函数类型从ab

(->) a 是类型构造函数的部分应用,它本身是一种类型为 * -> * 的类型构造函数。

您可以将其视为“来自 a 的函数类型的构造函数”。例如。 (->) Int 是来自Int 的函数类型的构造函数。您可以通过将另一个类型传递给它来构造完整的函数类型:(->) Int String 是从IntString 的函数类型。

instance Functor (->) a 是一个带有fmap 操作的函子,将a -> b 函数转换为a -> c 函数。您可以通过将fmap 参数应用于Right 值,将其与将Either a b 映射到Either a c 的类似instance Functor (Either a) 进行比较。

【讨论】:

  • 谢谢。这对我来说很有意义。对 Haskell 来说还是有点新,所以我需要一些时间来消化。
  • 在我看来,(->) r 实例非常难以理解。我对很多 Haskell 感到相对自信,但我仍然对 (->) r 实例的工作原理完全没有直觉。我可以使用它们,因为我一直都在使用它们,所以对我来说不再那么奇怪了。只是我不会说我很了解他们。如果您也不担心,请不要担心。我相信它会及时出现在我们俩身上。
  • @kqr 当您知道 Monad 实例的作用时,我认为您可以以一种很好的方式派生它。我写的这个小笔记以>>= 的一个非常冗长(但我希望有点容易理解)的定义开始,然后展示了如何在正确打高尔夫球时与您可能从 LYAH 知道的通常实现相同,例如. github.com/quchen/articles/blob/master/…
  • @kqr 是的,(->) r 真的很奇怪。就像,它允许您以无点样式重写diag f x = (x, x) 为...diag = join (,)!当 lambdabot 告诉我这一点时,我的反应是“wat”。
【解决方案2】:

我们可以使用 lambda 函数和中缀函数:

(->) a    =    \b ->  (->) a b  --pseudo-Haskell
(->) a    =    \b ->  a -> b    --pseudo-Haskell

所以,将实例读为:

class Functor f where
   fmap :: (a->b) -> f a -> f b

instance Functor ((->)r) where
   fmap :: (a->b) -> f     a  -> f     b
         = (a->b) -> (->)r a  -> (->)r b   --pseudo-Haskell
         = (a->b) -> (r -> a) -> (r -> b)  --pseudo-Haskell

【讨论】:

  • 这实际上对我的直觉很有帮助。我需要为 (->) r! 的应用实例做同样的事情!
【解决方案3】:

您可以将其视为r -> a 类型的集合,其中r 是固定的。

仿函数是一个类型函数m,这意味着对于任何类型a,你都有一个类型m a。例如Maybe[](->) r。后者可能最好写成(r ->),但我不知道是否允许。

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2021-11-16
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多