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

mac*_*ian 44 syntax haskell types function

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

run :: Int -> Int -> Int
--  ??
Run Code Online (Sandbox Code Playgroud)

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

nin*_*cko 40

你可以google haskell "double colon"或类似的东西; 很遗憾谷歌的语法有点困难,但在这种情况下你可以命名.

在Haskell中,如果没有它,你的程序通常会正常运行(尽管你会想用它来磨练你定义的任何函数的规范,这是一个好习惯).

这个想法是你可以在:: ...任何地方插入(甚至在表达式的中间)来说"按照编译先生的方式,这个表达式应该是类型...".如果可以证明这可能不是这种情况,则编译器将抛出错误.

我想你也可以用它来"转换"你想要的版本的功能; 例如,如果一个函数是"多态的"(具有一般类型签名)并且您实际上想要,比如说Integer,那么您可以:: Integer对结果值执行操作; 我虽然有点生疏.

  • 这正是让我来到这里的搜索词...... (30认同)
  • 这个记号从何而来?它以数学为基础吗? (2认同)

Raf*_*ini 14

你应该阅读:

foo :: a 
Run Code Online (Sandbox Code Playgroud)

作为"名称foo是类型的值a".当你写:

run :: a -> b 
Run Code Online (Sandbox Code Playgroud)

这意味着:

  1. 你是在宣布这个名字run.

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

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

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


ham*_*mar 6

当你有一个看起来很可怕的类型检查错误时,你可以(暂时)包装部分代码,(myexpression :: MyType)以明确地向编译器说明你期望myexpression拥有的类型.这通常有助于编译器为您提供更好的错误消息.