gpt4 book ai didi

haskell - 为什么 Haskell 中不允许同时定义所有类型的函数?

转载 作者:行者123 更新时间:2023-12-03 11:03:19 25 4
gpt4 key购买 nike

这可能是一个非常基本的问题,但是......

一个定义为的函数,比如说

foo :: a -> Integer

表示从任何类型到整数的函数。如果是这样,那么理论上应该能够为任何类型定义它,就像这样
foo 1 = 10
foo 5.3 = 100
foo (x:xs) = -1
foo _ = 0

但 Haskell 只允许一般定义,如 foo a = 0 .

即使你限制 a成为某一类类型之一,例如 Show typeclass 的一个实例:
foo :: (Show a) => a -> Integer

你仍然不能做类似的事情
foo "hello" = 10
foo _ = 0

即使 "hello" :: [Char]Show 的一个实例

为什么会有这样的限制?

最佳答案

这是一个特性,实际上是非常基本的。它归结为编程语言理论中称为参数的属性。粗略地说,这意味着评估永远不应该依赖于编译时变量的类型。您不能静态地查看不知道其具体类型的值。

为什么这么好?它提供了关于程序的更强的不变量。例如,您仅从类型就知道 a -> a必须是恒等函数(或发散)。类似的“自由定理”适用于许多其他多态函数。参数化也是更高级的基于类型的抽象技术的基础。例如,类型 ST s a在 Haskell(状态单子(monad))中,以及相应的类型 runST函数,依赖s是参数化的。这确保了正在运行的函数不会弄乱状态的内部表示。

这对于有效实现也很重要。程序不必在运行时传递昂贵的类型信息(类型删除),编译器可以为不同的类型选择重叠的表示。作为后者的一个例子,0 和 False 以及 () 和 [] 在运行时都用 0 表示。如果允许像您这样的功能,这是不可能的。

关于haskell - 为什么 Haskell 中不允许同时定义所有类型的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10811657/

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