I have a newtype Value wrapper with a Number type. How do I perform operations with primitive types Number/ Int.

```
newtype Value = Value Number
derive newtype instance showValue :: Show Value
derive newtype instance eqValue :: Eq Value
derive newtype instance semiringValue :: Semiring Value
derive newtype instance ringValue :: Ring Value
instance semigroupValue :: Semigroup Value where append = (+)
instance monoidValue :: Monoid Value where mempty = zero
derive instance genericValue :: Generic Value _
instance decodeValue :: Decode Value where
decode = genericDecode $ defaultOptions { unwrapSingleConstructors = true }
valueMultiplier :: Value -> Int -> Value
valueMultiplier a b = over Value (under a * b)
```

I have tried this but I am getting typesDoNotUnify error

Which types arenâ€™t unifying?

By searching for `Int -> Number`

, looks like you want to change the `Int`

type to a `Number`

type. Youâ€™ll likely get another error after that (Value isnâ€™t Numer), but itâ€™ll be one step closer to your goal.

Using toNumber seems to working for valueMultiplier :: Number -> Int -> Number. Thank you for suggesting.

However, I am not able to understand how to operate on the underlying Number type. I would request to provide an example of how to use Data.Newtype.unwrap.

1 Like

Hi @deepaktatineni, is the below what you were after? Sorry about the auxiliary `go`

function but I wasnâ€™t sure if maintaining the argument order as `Value -> Int -> Value`

was important to you

```
derive instance newtypeValue :: Newtype Value _
valueMultiplier :: Value -> Int -> Value
valueMultiplier = flip go
where
go :: Int -> Value -> Value
go b = over Value (_ * toNumber b)
```

2 Likes