gpt4 book ai didi

haskell - Haskell 新手,不明白为什么我会收到无限类型错误

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

module Main where

rev :: [a] -> [a]
rev (x:[]) = x
rev (x:xs) = (rev xs):x

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

main = do
print (rev lst)

我正在努力通过 99 Haskell Problems并尝试编写一个函数来反转列表(是的,我知道前奏中已经有一个)。

我的问题是,当我尝试编译上面的代码(或者只是将函数定义输入 GHCi)时,我得到:
Occurs check: cannot construct the infinite type: a = [a]
In the expression: rev :: [a] -> [a]
In the definition of `it': it = rev :: [a] -> [a]

我不太确定我的类型在哪里出错以得到这个错误。我猜这与我的模式匹配方式有关,但我不知道为什么。

最佳答案

Travis 关于特定错误是正确的,但是为了以后在搜索“无限类型错误”时发现此问题的任何人,这就是(看似神秘的)消息的含义:

在其签名中具有类型变量的函数意味着它不关心它在那里接收到什么类型——它不检查该类型的值,它们只是黑盒子。然而,当实际使用这样的函数时,类型变量将在每次使用的基础上被确定为更具体的东西。但是,不需要特定类型——类型变量也可以用其他类型变量填充。这个统一过程是类型推断的一部分,让编译器可以在程序的不同部分组合未知类型变量。

绑定(bind)类型变量时发生的错误起初通常看起来很神秘,特别是当 GHC 尝试将变量组合在同一类型签名中时。例如:

  • 如果编译器试图统一两个不同的变量,它将提示“由类型签名绑定(bind)的刚性类型变量”,这意味着它无法统一这两种类型,因为您明确告诉它它们是不同的。
  • 如果编译器试图将一个类型变量与它自己的一个子集统一起来,比如决定类型变量a应与 [a] 相同,它会提示一个无限类型,这只是意味着天真的统一说a实际上是 [a]实际上是 [[a]]实际上是 [[[a]]] ... 等等。
  • 关于haskell - Haskell 新手,不明白为什么我会收到无限类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4124282/

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