我看到并使用::符号 * 无处不在 *,但仍然不知道在Haskell中编程时::符号的含义,例如:
::
run :: Int -> Int -> Int -- ??
在Haskell中,::(双冒号)代表什么?
huwehgph1#
你可以在谷歌上搜索haskell "double colon"或类似的东西;不幸是,在Google上搜索语法有点困难,但在本例中,您可以命名它。在Haskell中,没有它,程序通常也能正常运行(尽管您希望使用它来完善您定义的任何函数的规范,这是一个很好的实践)。这个想法是你可以在任何地方插入一个:: ...(甚至在表达式的中间)来表示“顺便说一句,编译器先生,这个表达式应该是...类型“。如果编译器可以证明这可能不是这种情况,那么编译器将抛出一个错误。我认为您还可以使用它将函数“强制转换”为您想要的版本;例如,如果一个函数是“多态的”(有一个通用的类型签名),而你实际上想要的是一个Integer,那么你可能会对结果值执行:: Integer;我有点生疏了。
haskell "double colon"
:: ...
...
Integer
:: Integer
ca1c2owp2#
您应该阅读:
foo :: a
为“名称foo引用a类型的值“。当您写入:
foo
a
run :: a -> b
这意味着:1.您正在声明名称run。1.此名称将引用类型为a -> b的值,a -> b类型是一个函数的类型,它接受a类型的值,并返回另一个b类型的值。你必须真正了解类型才能理解Haskell。类型系统是Haskell最重要的特性之一,也是它使语言如此富有表现力的原因。
run
a -> b
b
qzlgjiam3#
当你遇到一个看起来很可怕的类型检查错误时,你可以(暂时地)把代码的一部分 Package 在(myexpression :: MyType)中,向编译器明确地说明你希望myexpression是什么类型。这通常会帮助编译器给予更好的错误消息。
(myexpression :: MyType)
myexpression
hjzp0vay4#
多年以后,我偶然发现了这个词,并想指出其中的微妙之处。::确实表示某事物的一种类型,但它也用于描述某事物的kind:
kind
ghci> :type [] [] :: [a] ghci> :kind [] [] :: * -> *
类型和种类是相关的但又是不同的东西。我注意到这一点,从以下在Hackage:
class Applicative m => Monad (m :: Type -> Type) where ...
并且Type -> Type是* -> *的长形式。我认为阅读上面的方法是“对于一些类型'm',其中m具有* -> *类型,Monad m扩展Applicative m,并需要实现...”
Type -> Type
* -> *
Monad m
Applicative m
ohtdti5x5#
将文件目录或被排除项转换为特定值将被排除项转换为特定值键:值=简单键::值=在那里转换值值内部的键:值对键:值(键:值)强制转换值
5条答案
按热度按时间huwehgph1#
你可以在谷歌上搜索
haskell "double colon"
或类似的东西;不幸是,在Google上搜索语法有点困难,但在本例中,您可以命名它。在Haskell中,没有它,程序通常也能正常运行(尽管您希望使用它来完善您定义的任何函数的规范,这是一个很好的实践)。
这个想法是你可以在任何地方插入一个
:: ...
(甚至在表达式的中间)来表示“顺便说一句,编译器先生,这个表达式应该是...
类型“。如果编译器可以证明这可能不是这种情况,那么编译器将抛出一个错误。我认为您还可以使用它将函数“强制转换”为您想要的版本;例如,如果一个函数是“多态的”(有一个通用的类型签名),而你实际上想要的是一个
Integer
,那么你可能会对结果值执行:: Integer
;我有点生疏了。ca1c2owp2#
您应该阅读:
为“名称
foo
引用a
类型的值“。当您写入:这意味着:
1.您正在声明名称
run
。1.此名称将引用类型为
a -> b
的值,a -> b
类型是一个函数的类型,它接受a
类型的值,并返回另一个b
类型的值。你必须真正了解类型才能理解Haskell。类型系统是Haskell最重要的特性之一,也是它使语言如此富有表现力的原因。
qzlgjiam3#
当你遇到一个看起来很可怕的类型检查错误时,你可以(暂时地)把代码的一部分 Package 在
(myexpression :: MyType)
中,向编译器明确地说明你希望myexpression
是什么类型。这通常会帮助编译器给予更好的错误消息。hjzp0vay4#
多年以后,我偶然发现了这个词,并想指出其中的微妙之处。
::
确实表示某事物的一种类型,但它也用于描述某事物的kind
:类型和种类是相关的但又是不同的东西。
我注意到这一点,从以下在Hackage:
并且
Type -> Type
是* -> *
的长形式。我认为阅读上面的方法是“对于一些类型'm',其中m具有
* -> *
类型,Monad m
扩展Applicative m
,并需要实现...”ohtdti5x5#
将文件目录或被排除项转换为特定值将被排除项转换为特定值
键:值=简单键::值=在那里转换值值内部的键:值对
键:值(键:值)强制转换值