首页 > 解决方案 > 无法匹配 haskell 中的预期类型

问题描述

    data NumberSystem = NumberSystem_ NumberSystemType deriving(Show,Eq,Read)
    data NumberSystemType = Decimal | Binary | Hex | Ocatl deriving(Show,Eq,Read)
    data Constant = Number Int deriving(Show,Eq,Read)
    
    data Number1 = NumberSystem Constant
    data Number2 = NumberSystemType Constant
    
    value1 = (NumberSystem_ Binary) (Number 10010)
    value2 = (Binary) (Number 101)

变量 value1 和 value2 都出现错误。

NumberSystem.hs:20:10: error:
    • Couldn't match expected type ‘Constant -> t’
                  with actual type ‘NumberSystem’
    • The function ‘NumberSystem_’ is applied to two arguments,
      but its type ‘NumberSystemType -> NumberSystem’ has only one
      In the expression: (NumberSystem_ Binary) (Number 10010)
      In an equation for ‘value1’:
          value1 = (NumberSystem_ Binary) (Number 10010)
    • Relevant bindings include
        value1 :: t (bound at NumberSystem.hs:20:1)
   |
20 | value1 = (NumberSystem_ Binary) (Number 10010)
   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

NumberSystem.hs:22:10: error:
    • Couldn't match expected type ‘Constant -> t’
                  with actual type ‘NumberSystemType’
    • The function ‘Binary’ is applied to one argument,
      but its type ‘NumberSystemType’ has none
      In the expression: (Binary) (Number 101)
      In an equation for ‘value2’: value2 = (Binary) (Number 101)
    • Relevant bindings include
        value2 :: t (bound at NumberSystem.hs:22:1)
   |
22 | value2 = (Binary) (Number 101)
   |          ^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.
Prelude> 

标签: haskell

解决方案


该表达式(Binary) (Number 101)被解释为使用1 个参数调用Binary构造函数Number 101,但Binary没有任何字段。这就是错误消息显示的原因:

    • The function ‘Binary’ is applied to one argument,
      but its type ‘NumberSystemType’ has none

如果您想要Number1Number2表示一数字系统类型和一个数字,那么您在它们的定义中缺少构造函数名称:

data Number1 = Number1 NumberSystem Constant
data Number2 = Number2 NumberSystemType Constant

value1 :: Number1
value1 = Number1 (NumberSystem_ Binary) (Number 10010)

value2 :: Number2
value2 = Number2 Binary (Number 101)

但是,该NumberSystem类型是多余的,因为它只包含一个 type 字段NumberSystemType,因此您可以将这两个定义合并为一个类型,对于Number1and 也是如此Number2。为了保持一致性,我将遵循传统的 Haskell 风格,将数据构造函数命名为与每种类型的类型构造函数相同。

-- A ‘NumberSystemType’ is one of the following 4 constructors.
data NumberSystemType = Decimal | Binary | Hex | Octal
  deriving (Eq, Read, Show)

-- ‘Constant’ has 1 constructor, also named ‘Constant’,
-- with 1 field of type ‘Int’. (So ‘newtype’ would also work.)
data Constant = Constant Int
  deriving (Eq, Read, Show)

-- A ‘Number’ has 2 fields, of type ‘NumberSystemType’ and ‘Constant’.
data Number = Number NumberSystemType Constant
  deriving (Eq, Read, Show)

value1, value2 :: Number
value1 = Number Binary (Constant 10010)
value2 = Number Binary (Constant 101)

推荐阅读