使用 `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 可以用来防止 xydoit.

中混淆

这是真的吗,还是我误会了?

+ 可以工作之前,您需要“解开”新类型。

doit :: X -> Y -> Double
doit (X x) (Y y) = x + y

在这里,我使用模式匹配来解开每个参数中的 Double。这里,xy都是Double,所以直接用x + y相加就可以了。

您使用 模式匹配 :

从数据构造函数中解包元素
doit :: X -> Y -> Double
doit <b>(X</b> x<b>) (Y</b> y<b>)</b> = x + y

这里的 xy 因此是 Double,因为 XY 数据构造函数包装的参数是 Doubles 也是。