这是我在文件Temp.hs
中的代码:
{-# LANGUAGE OverloadedStrings #-}
module Temp where
import Data.String
string1 = "Darth Vader"
string2 = "Obi-Wan Kenobi"
问题是我想要重载字符串。据我所知,重载字符串是多态的,属于类型类IsString
。所以当在GHC中加载上述文件并执行
:t string1
,
我应该
string1 :: Data.String.IsString a => a
但我得到的是:
string1 :: String
帮助!
答案 0 :(得分:4)
这个答案基于user2407038的评论
事实证明,在代码中添加string1
可以解决问题。但我不推荐它。阅读Monomorphism Restriction。
但事实证明,你不必这样做。 GHC执行其单态事物并将String
的类型设置为OverloadedStrings
,但仅仅因为它认为您不希望它成为其他任何东西。但string1 = "Darth Vader"::ByteString
扩展仍然有效!您会注意到,如果您执行类似
string1
GHC会更乐意将您的ByteString
变量设为{{1}}。
我在Haskell的Monomorphism Restriction Wiki页面中注意到的另一件事是:
默认情况下,在已编译的模块中启用限制,并且 在GHCi提示下默认关闭(自GHC 7.8.1起)。