匿名功能概念理解

Anc*_*end 5 lambda haskell language-design

我正在努力学习和理解Haskell的设计.我目前正在使用Lambda/Anonymous函数,我很想知道.

为什么不是Eq类的函数类型实例?

Prelude> (\z -> z + 5) == (+5)
Run Code Online (Sandbox Code Playgroud)

在这个问题上,我想知道是否因为z可以是任何东西,甚至可能是一个自由变量,在所有lambda函数中,所以制作类型为Eq的lambda函数将是一个设计缺陷.

为什么不是类型类Show的函数类型实例?

Prelude> (\q -> q - 2)
Run Code Online (Sandbox Code Playgroud)

我感谢任何澄清.

提前谢谢了!

Pet*_*all 9

这些功能是相同的还是不同的:

dbl1 :: Int -> Int
dbl1 x = x + x

dbl2 :: Int -> Int
dlb2 x = 2 * x
Run Code Online (Sandbox Code Playgroud)

对于某些函数,编译器"很容易"看到它们包含相同的逻辑.但是大多数功能都很难比较.然后,有在逻辑上是不同的功能,但相同的行为-就像dbl1dbl2以上.因此,您必须做出选择,以针对每个可能的值测试它们,或者确定它们不相等.在大多数情况下,前者完全不切实际.后者绝对不可取或不直观.现在,考虑到问题已经难以解决,然后投入IO......


Lui*_*las 6

我认为戴夫和彼得都没有强调过的一个关键概念是:当且仅当(a)它们具有相同的类型时,两个函数是相等的,并且(b)对于你可以给出它们的每个可能的参数,它们都产生同样的结果.

现在,有了这个清楚,答案Eq正是他们所说的.Peter指出Eq函数的实例需要能够分析两个任意函数并正确地确定它们是否为任何两个输入产生相同的结果.正如戴夫指出的那样,这实际上在数学上是不可能的; 任何试图比较任意函数的检查器都会因某些函数而失败 - 这意味着它会挂起或在某些情况下产生错误的答案.

你会看到Haskell程序员一直在讨论函数的相等性,但是大多数时候他们的意思是人类已经证明了两个函数是相等的.例如,函数组合运算符定义如下:

(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

现在,我们可以证明所有可能的h :: c -> d,g :: b -> c并且h :: a -> b,f . (g . h) == (f . g) . h.在这种情况下,它非常简单,我们只是根据定义扩展表达式(.),我们对两者都有相同的结果:

f . (g . h) = f . (\y -> g (h y))          -- expand `g . h` by definition
            = \x -> f ((\y -> g (h y)) x)  -- expand `f . (\y -> g (h y))`
            = \x -> f (g (h x))            -- apply the inner lambda

(f . g) . h = (\y -> f (g y)) . h
            = \x -> (\y -> f (g y)) (h x)
            = \x -> f (g (h x))
Run Code Online (Sandbox Code Playgroud)

但这只能用于精心选择的功能,而计算机通常不能很好地或可靠地完成.对于你编写的任何程序来尝试测试任意函数的相等性,会有一些函数会产生错误的答案或永远循环.

  • 计算机可以显示功能也是相同的 - 重点是它不是*可判定的*(通常),这适用于人类和机器.我不能解决一般的停顿问题,可以吗? (4认同)