::(双冒号)代表啥?
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
并需要实现 ...”
【讨论】:
以上是关于::(双冒号)代表啥?的主要内容,如果未能解决你的问题,请参考以下文章
linux脚本中的冒号是啥意思? 第一行:read YN , 第二行 :$YN:=yes,第三行 case $YN in ...