gpt4 book ai didi

haskell - 何时在 Haskell 中利用类型推断?

转载 作者:行者123 更新时间:2023-12-03 20:13:14 26 4
gpt4 key购买 nike

我很好奇有经验的 Haskell 程序员在实践中真正使用类型推断的频率。我经常看到它被称赞为优于某些其他语言所需的始终显式声明的优势,但出于某种原因(也许只是因为我是新手),几乎一直“感觉”编写类型签名是正确的。 .而且我敢肯定在某些情况下它确实是必需的。

一些有经验的 Haskellers(Haskellites?Haskellizers?)可以提供一些输入吗?

最佳答案

即使您编写类型签名,这仍然是一个优势,因为编译器会在您的函数中捕获类型错误。我通常也写类型签名,但在 where 这样的地方省略它们或 let您实际定义新符号但不需要指定类型签名的子句。

愚蠢的例子,用一种奇怪的方式计算数字的平方:

squares :: [Int]
squares = sums 0 odds
where
odds = filter odd [1..]
sums s (a:as) = s : sums (s+a) as

square :: Int -> Int
square n = squares !! n
oddssums如果编译器不会自动推断它们,则需要类型签名的函数。

此外,如果您像往常一样使用泛型函数,类型推断可以确保您真正以有效的方式将所有这些泛型函数组合在一起。如果你在上面的例子中说
squares :: [a]
squares = ...

编译器可以推断出这种方式无效,因为使用的函数之一(标准库中的 odd 函数)需要 a属于类型类 Integral .在其他语言中,您通常只能在以后才认识到这一点。

如果在 C++ 中将其编写为模板,则在非整数类型上使用该函数时会出现编译器错误,但在定义模板时不会。这可能会让人非常困惑,因为您并不能立即清楚您哪里出错了,您可能需要查看一长串错误消息才能找到问题的真正根源。在 python 之类的东西中,您会在运行时在某个意外点收到错误,因为某些东西没有预期的成员函数。在更松散类型的语言中,您可能不会收到任何错误,而只会收到意想不到的结果。

在 Haskell 中,编译器可以确保可以使用其签名中指定的所有类型调用该函数,即使它是对满足某些约束的所有类型(也称为类型类)有效的通用函数。这使得以通用方式编程和使用通用库变得容易,而在其他语言中很难做到这一点。即使您指定了泛型类型签名,编译器中仍然会进行大量类型推断,以找出每次调用中使用的特定类型以及该类型是否满足函数的所有要求。

关于haskell - 何时在 Haskell 中利用类型推断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/463870/

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