Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Haskell中没有runConst函数?_Haskell - Fatal编程技术网

为什么Haskell中没有runConst函数?

为什么Haskell中没有runConst函数?,haskell,Haskell,是否有一个约定,让我知道什么时候应该使用runX而不是getXtypeclass函数?这纯粹是作者如何思考它们代表的问题。它通常更多地是关于被表示的“抽象概念”,而不是用来表示它的实际数据结构 如果您有某种类型的X,并将X值视为可以运行以获取值的计算,那么您将有一个runX函数。如果您认为它更像一个容器,那么您将拥有一个getX函数(还有其他可能的解释,可能导致runX或getX或其他什么,这只是两种常见的思考值的方法) 当然,当我们使用第一类Haskell值来表示事物(函数是非常好的值)时,很

是否有一个约定,让我知道什么时候应该使用
runX
而不是
getX
typeclass函数?

这纯粹是作者如何思考它们代表的问题。它通常更多地是关于被表示的“抽象概念”,而不是用来表示它的实际数据结构

如果您有某种类型的
X
,并将
X
值视为可以运行以获取值的计算,那么您将有一个
runX
函数。如果您认为它更像一个容器,那么您将拥有一个
getX
函数(还有其他可能的解释,可能导致
runX
getX
或其他什么,这只是两种常见的思考值的方法)

当然,当我们使用第一类Haskell值来表示事物(函数是非常好的值)时,很多时候你可以很好地将事物解释为计算或容器。考虑“代码>状态< /代码>以表示有状态计算;当然,这必须解释为一种计算,对吗?我们之所以说
runState::State sa->s->(a,s)
,是因为我们认为它“运行”了
状态sa
,需要一个
s
作为额外的输入。但我们可以很容易地将其视为从
状态sa中“获取”一个
s->(a,s)
——将
状态看作一个容器

所以在
runX
getX
之间的选择在任何深奥的时态中都没有真正的意义,但它告诉你作者是如何看待
X
(也许他们认为你应该如何看待它)

Const
的命名类似于函数
Const
(该函数使用一个参数生成“常量函数”,该函数接受另一个输入,忽略它,并返回
Const
的第一个输入是什么)。但它被认为是在类型级别上运行的
Const
接受一个类型并生成一个“类型级别函数”,该函数忽略应用它的任何类型,然后与应用到的第一个类型同构。同构而不是相等,因为要创建可能具有不同实例的新类型,它需要有一个构造函数。在值级别,为了成为同构,您需要能够从
a
(即
Const
构造函数)获取
a
,然后从
Const a b
中获取
a
。由于“同构于
a
”是我们所需要的所有属性,因此,除了作为
a
的简单容器之外,没有真正的需要将其视为做任何事情,因此我们有
getConst


Identity
似乎和“仅仅是一个容器”一样明显,我们有
runIdentity
。但是拥有
身份
的主要动机之一是将
身份a
视为一种“一元计算”,就像
状态sa
读卡器ea
等值一样。因此,为了继续进行类比,我们将
Identity
视为我们运行的“不做任何事情”计算,而不是从中获取值的简单包装容器。将身份看作一个容器(可能是最简单的容器)是完全正确的,但这不是作者选择关注的解释。

据我所知,这是一个不一致的说法,背后没有任何理由。我猜你的意思是
Const
?为什么您希望有一个
runConst
函数?它是什么类型的?或者您希望
getConst
被命名为
runConst
?对于记录选择器的命名没有约定(也许除了它应该以某种方式反映字段的语义)。(旁白:这些不是类型类函数)我不知道有什么约定,但我通常想象
runX
做一些事情(比如执行/返回函数或返回一元动作),然后
getX
提取一些东西
runConst
作为一个名称没有太大意义,因为它只是取消了一个值的装箱。另一个常见的混淆变量是
unX
@4castle,当然,但我们有
runIdentity
,如果有提取程序的话,它就是一个提取程序。顺便说一句,我不会称之为“拆箱”;这有着完全不同的含义。