gpt4 book ai didi

haskell - 模棱两可的类型变量,但不在 ghci 中?

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

谁能解释为什么haskell在以下示例中强制执行显式类型签名以及如何修改它以避免需要显式声明?

import qualified Data.List as L

main = do
print $ length $ L.nub [1,1,2,3] -- 3, passed (Eq a, Num a) => [a]
print $ length $ L.nub [] -- ambiguous type error, passed (Eq a) => [a]
-- can help type system with explicit signature but how to avoid ?
print $ length $ L.nub ([] :: [Int])

令人惊讶的是,在 ghci 中以交互方式编写的相同代码没有歧义,并且打印零长度:
λ> :m +Data.List
λ> print $ length $ nub []
0 -- ?? can you explain ??

更新:
它似乎与 Data.List.nub 一样受到限制长度函数不会停止对模棱两可的类型的提示:
length' :: Eq a => [a] -> Int
length' [] = 0
length' (x:xs) = 1 + length' xs

main = do
print $ length' $ nub []
-- No instance for (Eq a0) arising from a use of ‘length'’
-- The type variable ‘a0’ is ambiguous

最佳答案

问题是 []具有多态类型 (Eq a) => [a] .由于length不添加任何特定的约束。

特别是 length 的类型是:

length :: [a] -> Int

这比 nub 更宽松:
nub :: Eq a => [a] -> [a]

编译器需要使用 length 的特定实例那里并且无法推断出 a 的类型.

现在你有两个选择:
  • 打开ExtendedDefaultRules扩展名 {-# LANGUAGE ExtendedDefaultRules #-}在文件的开头。
  • 明确:... L.nub ([] :: [Int])

  • 我会默认推荐第二个,除非你完全理解 consequences of the first one .

    关于haskell - 模棱两可的类型变量,但不在 ghci 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26467291/

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