::(双冒号)代表啥?

Posted

技术标签:

【中文标题】::(双冒号)代表啥?【英文标题】: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 - 很棒的书(也很有趣) 【参考方案1】:

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

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

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

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

【讨论】:

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

你应该阅读:

foo :: a 

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

run :: a -> b 

这意味着:

    您正在声明名称run

    此名称将引用类型为 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 并需要实现 ...”

【讨论】:

以上是关于::(双冒号)代表啥?的主要内容,如果未能解决你的问题,请参考以下文章

双冒号是啥意思?

C#中的#代表啥?

access数据库中表中字段前的黄色符号代表啥?

英语中都有哪些标点符号,各代表啥意思

linux脚本中的冒号是啥意思? 第一行:read YN , 第二行 :$YN:=yes,第三行 case $YN in ...

Pig中的双冒号到底是啥意思?