-1

What I want is following, I have a row type:

type FooBarBaz =
  ( foo :: Int
  , bar :: String
  , baz :: Boolean
  )

Then a need a function that takes this row type record but without "foo": and adds default "foo" field:

withoutFoo { bar: "bar", baz: true} -- > { foo: 1, bar: "bar", baz: true}

I tried to do something like this, but can not get it around:

withoutFoo :: ∀ r.
  Lacks "foo" r =>
  Cons "foo" Int r FooBarBaz =>
  { | r } -> { | FooBarBaz }
withoutFoo props = Record.union { foo: 1 } props

UPD:

managed to solve it with Union constraint:

withoutFoo :: ∀ r.
  Union r ( foo :: Int ) FooBarBaz =>
  { | r } -> { | FooBarBaz }
withoutFoo props =
  Record.merge props { foo: 1 }

WHITECOLOR
  • 24,996
  • 37
  • 121
  • 181

1 Answers1

1

The problem is that your function isn't actually generic. There is only one possible choice for r: it should always be (bar :: String, baz :: Boolean)

So just make that the type of your function:

withoutFoo :: { bar :: String, baz :: Boolean } -> { | FooBarBaz }
withoutFoo props = Record.union { foo: 1 } props
Fyodor Soikin
  • 78,590
  • 9
  • 125
  • 172