使用 `newtype` 包装其他类型
Using `newtype` to wrap other types
我正在尝试理解 newtype
并认为这行得通:
module NT where
newtype X = X Double
newtype Y = Y Double
doit :: X -> Y -> Double
doit x y = x + y
x = X 1.1
y = Y 2.2
-- doit x y should work
-- doit y x should error
产生的第一个错误是:
NT.hs:7:12: error:
• Couldn't match expected type ‘Double’ with actual type ‘X’
• In the expression: X x + Y y
In an equation for ‘doit’: doit x y = X x + Y y
|
7 | doit x y = X x + Y y
|
我知道类型不匹配,我只是不知道如何解决它。我认为像这样包装 Double
可以用来防止 x
和 y
在 doit
.
中混淆
这是真的吗,还是我误会了?
在 +
可以工作之前,您需要“解开”新类型。
doit :: X -> Y -> Double
doit (X x) (Y y) = x + y
在这里,我使用模式匹配来解开每个参数中的 Double
。这里,x
和y
都是Double
,所以直接用x + y
相加就可以了。
您使用 模式匹配 :
从数据构造函数中解包元素
doit :: X -> Y -> Double
doit <b>(X</b> x<b>) (Y</b> y<b>)</b> = x + y
这里的 x
和 y
因此是 Double
,因为 X
和 Y
数据构造函数包装的参数是 Double
s 也是。
我正在尝试理解 newtype
并认为这行得通:
module NT where
newtype X = X Double
newtype Y = Y Double
doit :: X -> Y -> Double
doit x y = x + y
x = X 1.1
y = Y 2.2
-- doit x y should work
-- doit y x should error
产生的第一个错误是:
NT.hs:7:12: error:
• Couldn't match expected type ‘Double’ with actual type ‘X’
• In the expression: X x + Y y
In an equation for ‘doit’: doit x y = X x + Y y
|
7 | doit x y = X x + Y y
|
我知道类型不匹配,我只是不知道如何解决它。我认为像这样包装 Double
可以用来防止 x
和 y
在 doit
.
这是真的吗,还是我误会了?
在 +
可以工作之前,您需要“解开”新类型。
doit :: X -> Y -> Double
doit (X x) (Y y) = x + y
在这里,我使用模式匹配来解开每个参数中的 Double
。这里,x
和y
都是Double
,所以直接用x + y
相加就可以了。
您使用 模式匹配 :
从数据构造函数中解包元素doit :: X -> Y -> Double
doit <b>(X</b> x<b>) (Y</b> y<b>)</b> = x + y
这里的 x
和 y
因此是 Double
,因为 X
和 Y
数据构造函数包装的参数是 Double
s 也是。