gpt4 book ai didi

haskell - 无点函数实际上是如何 "functions"?

转载 作者:行者123 更新时间:2023-12-02 16:10:58 25 4
gpt4 key购买 nike

Conal这里认为无效构造类型不是函数。然而,无点函数是这样描述的,例如Wikipedia。 ,当他们在定义中没有明确的参数时,这似乎是柯里化(Currying)的一个属性。它们的具体功能如何?

具体来说:f = map怎么样?和f = id . map在这种情况下有所不同?如 f = map只是绑定(bind)到一个恰好是函数的值,其中 f简单地“返回”map (类似于 f = 2 “返回” 2 )然后接受参数。但是f = id . map被称为函数,因为它是无点的。

最佳答案

Conal 的博客文章归结为“非函数不是函数”,例如False 不是一个函数。这是很明显的;如果您考虑所有可能的值并删除具有函数类型的值,那么剩下的值...不是函数。

这与无点定义的概念完全无关。

考虑以下函数定义:

map1, map2, map3, map4 :: (a -> b) -> [a] -> [b]

map1 = map

map2 = id . map

map3 f = map f

map4 _ [] = []
map4 f (x:xs) = f x : map4 f xs

这些都是同一函数的定义(并且还有无数种方法可以定义与 map 函数等效的函数)。 map1 显然是一个无点定义; map4 显然不是。它们显然都具有函数类型(相同!),那么我们怎么能说无点定义不是函数呢?仅当我们将“函数”的定义更改为 Haskell 程序员通常所理解的其他内容时(即函数是 x -> y 类型,对于某些 xy;在本例中,我们使用 a -> b 作为 x[a] -> [ b] 代表 y)。

并且map3的定义是“部分无点”(点减少?);该定义将其第一个参数命名为 f,但没有提及第二个参数。

所有这一切的要点是“无点”是定义的性质,而“作为函数”是的属性。无点函数的概念实际上没有意义,因为给定的函数可以通过多种方式定义(其中一些是无点的,另一些不是)。每当你看到有人谈论无点函数时,他们指的是无点定义

您似乎担心 map1 = map 不是一个函数,因为它只是对现有值 map 的绑定(bind),就像 x = 2 一样。你在这里混淆了概念。请记住,函数在 Haskell 中是一流的; “函数的东西”是“值的东西”的子集,而不是不同类别的东西!因此,当map是一个现有值并且是一个函数时,那么map1 = map只是将新名称绑定(bind)到现有值。它定义了函数map1;两者并不相互排斥。

您通过查看代码来回答“这个点是否是自由的”问题;函数的定义。您可以通过查看类型来回答“这是一个函数吗”这个问题。

关于haskell - 无点函数实际上是如何 "functions"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30147368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com