haskell 什么是:(双冒号)代表什么?

3wabscal  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(209)

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

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

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

huwehgph

huwehgph1#

你可以在谷歌上搜索haskell "double colon"或类似的东西;不幸是,在Google上搜索语法有点困难,但在本例中,您可以命名它。
在Haskell中,没有它,程序通常也能正常运行(尽管您希望使用它来完善您定义的任何函数的规范,这是一个很好的实践)。
这个想法是你可以在任何地方插入一个:: ...(甚至在表达式的中间)来表示“顺便说一句,编译器先生,这个表达式应该是...类型“。如果编译器可以证明这可能不是这种情况,那么编译器将抛出一个错误。
我认为您还可以使用它将函数“强制转换”为您想要的版本;例如,如果一个函数是“多态的”(有一个通用的类型签名),而你实际上想要的是一个Integer,那么你可能会对结果值执行:: Integer;我有点生疏了。

ca1c2owp

ca1c2owp2#

您应该阅读:

foo :: a

为“名称foo引用a类型的值“。当您写入:

run :: a -> b

这意味着:
1.您正在声明名称run
1.此名称将引用类型为a -> b的值,
a -> b类型是一个函数的类型,它接受a类型的值,并返回另一个b类型的值。
你必须真正了解类型才能理解Haskell。类型系统是Haskell最重要的特性之一,也是它使语言如此富有表现力的原因。

qzlgjiam

qzlgjiam3#

当你遇到一个看起来很可怕的类型检查错误时,你可以(暂时地)把代码的一部分 Package 在(myexpression :: MyType)中,向编译器明确地说明你希望myexpression是什么类型。这通常会帮助编译器给予更好的错误消息。

hjzp0vay

hjzp0vay4#

多年以后,我偶然发现了这个词,并想指出其中的微妙之处。::确实表示某事物的一种类型,但它也用于描述某事物的kind

ghci> :type []
[] :: [a]

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

类型和种类是相关的但又是不同的东西。
我注意到这一点,从以下在Hackage:

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

并且Type -> Type* -> *的长形式。
我认为阅读上面的方法是“对于一些类型'm',其中m具有* -> *类型,Monad m扩展Applicative m,并需要实现...”

ohtdti5x

ohtdti5x5#

将文件目录或被排除项转换为特定值将被排除项转换为特定值
键:值=简单键::值=在那里转换值值内部的键:值对
键:值(键:值)强制转换值

相关问题