【问题标题】:Do Haskell imports have side effects?Haskell 导入有副作用吗?
【发布时间】:2013-02-02 21:21:49
【问题描述】:

我不久前写了一些代码,它使用OverloadedStrings 从十六进制编码的字符串文字创建ByteStrings,它使用base16-bytestring 提供的函数对其进行解码。这很好用,但似乎我并没有像我想象的那样理解它。

让我完全困惑的是这个。为什么

{-# LANGUAGE OverloadedStrings #-}

import Data.ByteString.Base16 ()
import qualified Data.ByteString as B

plaintext = "The message" :: B.ByteString

main = print plaintext

编译并运行正常,但如果我删除Data.ByteString.Base16 的导入,则编译失败(类似于this question):

test.hs:6:13:
No instance for (Data.String.IsString B.ByteString)
  arising from the literal `"The message"'

根据Haskell Wiki,像这样的导入“仅对导入类型类的实例有用”,但据我所知,base16-bytestring 源代码没有定义任何类型类实例,只有encode 和decode 函数。

导入如何为代码编译提供IsString 的必要实例?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    在 Haskell 中,类型类实例总是被导出和导入——你无法隐藏它们。这通常被称为“开放世界假设”。

    这意味着 typeclass 实例也可传递地导出:如果您导入带有实例的库,它也会从您的模块中导出。

    在这种情况下,IsString 实例在Data.ByteString.Char8 中,由Data.ByteString.Base16 导入。您应该能够将您的导入替换为:

    import Data.ByteString.Char8 ()
    

    如果您有兴趣,有一个很好的SO question 提供了一些关于开放世界假设的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-03
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多