【问题标题】:Module imports form a cycle模块导入形成一个循环
【发布时间】:2018-07-02 06:46:59
【问题描述】:

你好,我想知道你如何解决 Haskell 中的循环依赖

我有:
类型的模块。

module Company where

import Tclass

data Worker=Worker{
    age::Int,
    name::String,
    title::Title,
    income::Int
}

data Title=Manager | Dev | Tester deriving (Show)


data Company=Company{
    cname::String,
    people::[Worker],
    yf::Int
}

类型类实例的模块

module Tclass where
import System.Environment
import Company

class Console a where
    wLine::a->IO()
    rLine::IO String->a

instance Show Worker where
    show w="to be defined"
    print =putStr . show 

如果我只想在 ghci 中加载类型并使用它;我如何导入它们而不出现错误:

Module imports form a cycle:
         module `Tclass' (.\Tclass.hs)
        imports `Company' (Company.hs)
  which imports `Tclass' (.\Tclass.hs)

P.S我已经尝试创建一个辅助模块来导入这两个模块并且这两个模块也会导入它,但是这个也没有运气:

module Au where
 import Tclass
 import Company

module Company
 import Au

module Tclass 
 import Au

【问题讨论】:

  • 第一个模块好像不应该导入第二个,你能把import Tclass删掉重试吗?
  • 但如果我不导入 Company 模块内的 TClass ,我就不能使用 Show 的实例来表示 Worker 类型。
  • 那你能把 Show 实例移到另一个模块吗?在另一个模块中定义实例而不是数据定义是不好的做法(您将收到孤立实例警告)
  • 您可以在特定模块中拥有类型,但要使用它们的实例。
  • 这不是问题的一部分,但阅读您的代码我建议您阅读数据记录中的严格字段:stackoverflow.com/questions/8576795/… 这可能会有所帮助。

标签: haskell


【解决方案1】:

将 Show 实例移动到另一个模块,可以打破循环:

module Tclass where
import System.Environment
import Company

class Console a where
    wLine::a->IO()
    rLine::IO String->a

module Company where

data Worker=Worker{
    age::Int,
    name::String,
    title::Title,
    income::Int
}
instance Show Worker where
    show w="to be defined"
    print =putStr . show 

data Title=Manager | Dev | Tester deriving (Show)

data Company=Company{
    cname::String,
    people::[Worker],
    yf::Int
}

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多