gpt4 book ai didi

haskell - 函数长度 "a"不编译,如果启用了 OverloadedStrings 扩展

转载 作者:行者123 更新时间:2023-12-04 00:16:46 24 4
gpt4 key购买 nike

如果“ {-# LANGUAGE OverloadedStrings #-} ”包含在源文件的顶部或 package.yaml 中(我使用的是堆栈),则

length "a"  -- does not compile anymore.
但是自定义函数 length'工作正常
length' :: [a] -> Int 
length' xs = sum [1 | _ <- xs]
包裹 Data.String是进口的 - 我认为问题就在那里,但是,我有兴趣看看,如果有人有类似的问题。
堆栈和 GHC 版本:
版本 2.3.1,Git 修订版 x86_64 hpack-0.33.0,ghc-8.8.3
我使用的是 mac osx,但同样的错误在 Linux 和 Windows 中也是如此。
这是堆栈产生的错误:
/Users/admin1/Haskell/PROJECTS/orig1/src/Lib.hs:13:29: error:
• Ambiguous type variables ‘t0’,
‘a0’ arising from the literal ‘"a"’
prevents the constraint ‘(IsString (t0 a0))’ from being solved.
Probable fix: use a type annotation to specify what ‘t0’,
‘a0’ should be.
These potential instances exist:
instance (a ~ Char) => IsString [a] -- Defined in ‘Data.String’
...plus two instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the first argument of ‘length’, namely ‘"a"’
In the first argument of ‘show’, namely ‘(length "a")’
In the second argument of ‘($)’, namely ‘show (length "a")’
|
13 | putStrLn $ show (length "a") -- does not work, if "- OverloadedStrings" is on

最佳答案

这是因为 length 有签名length :: Foldable f => f a -> Int ,所以它可以是任何 Foldable类型。如果您使用 OverloadedStrings扩展名,然后 "foo"不再是 String , 可以是任何类型 IsString a => a , 并且这些的多个可以是 Foldable f => f a s 也是。
你可以做的是给编译器一个类型提示,例如:

length ("a" :: String)

关于haskell - 函数长度 "a"不编译,如果启用了 OverloadedStrings 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63161570/

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