haskell - 无法匹配 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>
解决方案
该表达式(Binary) (Number 101)
被解释为使用1 个参数调用Binary
构造函数Number 101
,但Binary
没有任何字段。这就是错误消息显示的原因:
• The function ‘Binary’ is applied to one argument,
but its type ‘NumberSystemType’ has none
如果您想要Number1
并Number2
表示一对数字系统类型和一个数字,那么您在它们的定义中缺少构造函数名称:
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
,因此您可以将这两个定义合并为一个类型,对于Number1
and 也是如此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)
推荐阅读
- node.js - 在firebase中,创建一个具有特定exp的自定义令牌?
- java - Elasticsearch Java Rest Client:如何获取所有索引的列表
- google-chrome - 如何在 Vimium 中移动一个字符而不突出显示?
- c# - WPF:如何在调整大小后保持 ListBox SelectedItem 可见?
- python - 如果其他元素使用理解匹配,则从两个字典列表中提取元素
- php - Angular 7 - http 帖子 - 标题内没有发送 PAYLOAD
- c# - 如何在 Xamarin 中创建新按钮
- openapi-generator - Openapi-generator spring:如何替换 @RequestMapping("${openapi.someproject.base-path:/v1}")
- html - 在网格中分离 Bootstrap Div
- python - Flutter 与 Python Django RESTFUL API