【问题标题】:Types Enums and Constructors类型枚举和构造函数
【发布时间】:2021-10-27 21:29:45
【问题描述】:

你好,我有以下几种:

type AlphaOne     = Int
type AlphaTwo     = String
type CharlieOne   = Int
type CharlieTwo   = String
type CharlieThree = Bool

data Sign         = Alpha (AlphaOne, AlphaTwo) |
                    Bravo |
                    Charlie CharlieOne CharlieTwo CharlieThree | 
                    Delta

data Color        = Red | Blue | Green

data Code         = C Sign Color

及以下功能:

foo :: Code -> Bool
foo (C sign _)
  | {-1-} sign == Charlie {-1-} = {-2-} do coo "with CharlieTwo of Charlie" {-2-}
  | ...

coo :: Charlie -> Bool
coo (Charlie _ charlieTwo _)
  | ...

我在代码中用 {-1-} 和 {-2-} 标记了我有问题的行。在 {-1-} 我收到错误“无法将预期类型 'Sign' 与实际类型 'CharlieOne -> CharlieTwo -> CharlieThree -> Sign' 匹配”。如何在这行代码中检查 sign 是否等于 Charlie,和 {-2-} 如何在这个函数中访问 CharlieTwo 的 CharlieTwo 以调用另一个以 CharlieTwo 作为参数的函数?

请原谅我是haskell的新手,我可能在这里做了一些愚蠢的事情,在此先感谢您的回答。

【问题讨论】:

标签: haskell types enums constructor


【解决方案1】:

此模式可帮助您匹配 Charlie 的任何内容:

foo :: Code -> Bool
foo (C (Charlie _ _ _) _) = True

运行一个简短的测试:

λ> foo (C (Charlie 1 "hello" True) Red) 
True

您的第二个函数的类型签名错误。

coo :: Charlie -> Bool
coo (Charlie _ charlieTwo _)
  | ...

Charlie 是术语级别的构造函数,但您在类型级别使用它。 Charlie 仍然是 Sign 类型,因此您必须将签名更改为以下内容:

coo :: Sign -> Bool

并对其进行模式匹配以访问CharlieTwo

coo :: Sign -> Bool
coo (Charlie _ charlie2 _) =

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多