为什么我不能重载字符串?

时间:2015-10-31 03:26:22

标签: haskell

这是我在文件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

帮助!

1 个答案:

答案 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起)。