【问题标题】:What does :: (double colon) stand for?::(双冒号)代表什么?
【发布时间】:2011-08-21 01:47:00
【问题描述】:

我看到并使用:: 符号无处不在,但仍然不知道在 Haskell 中编程时 :: 符号的含义,例如

run :: Int -> Int -> Int
--  ??

::(双冒号)在 Haskell 中代表什么?

【问题讨论】:

  • 表示有类型,所以run的类型是Int -> Int -> Int。你怎么会认为你甚至不知道基本的语言概念、符号和概念就可以阅读 Haskell 程序?有时阅读语言参考是一个好主意,而 Haskell 有一个非常好的。
  • 谢谢@Ingo 我在哪里可以找到该参考资料?
  • 您的出发点始终是 haskell.org。 Haskell 2010 报告在这里:haskell.org/definition/haskell2010.pdf
  • learnyouahaskell.com - 很棒的书(也很有趣)

标签: function haskell syntax types


【解决方案1】:

你可以用谷歌搜索haskell "double colon" 或类似的东西;不幸的是,用谷歌搜索语法有点困难,但在这种情况下你可以命名它。

在 Haskell 中,如果没有它,您的程序通常可以正常运行(尽管您会希望使用它来完善您定义的任何函数的规范,这是一种很好的做法)。

这个想法是你可以在任何地方(甚至在表达式的中间)插入一个:: ... 来表示“顺便说一句,编译器先生,这个表达式应该是... 类型”。如果可以证明情况并非如此,编译器就会抛出错误。

我认为您也可以使用它来将功能“转换”为您想要的版本;例如如果一个函数是“多态的”(具有通用类型签名)并且您实际上想要一个Integer,那么您可能可以对结果值执行:: Integer;不过我有点生疏了。

【讨论】:

  • 你还有更复杂的多态情况,你想描述的不是特定的类型,而是类型的种类;指定类型甚至适用于普通的多态性。
  • 这正是让我来到这里的搜索词......
  • 这个符号从何而来?它是基于数学的吗?
  • 这个 (::) 是否作为语言中的实际运算符存在?因为当我使用 GHC 时,我无法做到:t (::):k (::)。此外,它似乎对 Data.Typeable 很有用,您可以在其中尝试将一种类型转换为另一种类型。
【解决方案2】:

你应该阅读:

foo :: a 

因为“名称foo 指的是a 类型的值”。当你写:

run :: a -> b 

这意味着:

  1. 您正在声明名称run

  2. 此名称将引用类型为 a -> b 的值,

a -> b 类型是一个函数的类型,它接受 a 类型的值并返回另一个 b 类型的值。

你必须真正了解类型才能理解 Haskell。类型系统是 Haskell 最重要的特性之一,它使语言如此富有表现力。

【讨论】:

  • 所以:: 是一个typedef?
【解决方案3】:

当您遇到看起来很吓人的类型检查错误时,您可以(暂时)将部分代码包装在 (myexpression :: MyType) 中,以向编译器明确说明您期望 myexpression 具有哪种类型。这通常会帮助编译器为您提供更好的错误消息。

【讨论】:

    【解决方案4】:

    多年后,我遇到了这个问题,并认为我会指出这里有一个微妙之处。 :: 确实表示某种类型。但它也用于描述某事的kind

    ghci> :type []
    [] :: [a]
    
    ghci> :kind []
    [] :: * -> *
    
    

    类型和种类是相关但不同的东西。

    我从 Hackage 中的以下内容中注意到了这一点:

    class Applicative m => Monad (m :: Type -> Type) where
       ...
    

    Type -> Type* -> * 的长格式。

    我认为阅读上述内容的方式是“对于某些类型'm',其中 m 具有类型 * -> *Monad m 扩展 Applicative m 并需要实现 ...”

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 2019-09-14
      • 2011-03-01
      • 2014-11-24
      • 2016-05-16
      • 1970-01-01
      • 2012-12-20
      • 2014-02-05
      相关资源
      最近更新 更多