1
votes

Trying out the purescript FFI, and following the "Purescript By Example" book, I have created a JS file to get the head of an array:

exports.head = function(arr) {
  return arr[0];
};

And in purescript I declare a new Undefined data for the type signature of head to indicate the undefined returned when the array is empty:

foreign import data Undefined :: Type -> Type
foreign import head :: forall a. Array a -> Undefined a

Now, how do I use a value of type Undefined a? What function do I need to define to extract the a so I can use it elsewhere? The example in the book follows by just defining a function:

foreign import isUndefined :: forall a. Undefined a -> Boolean

as:

exports.isUndefined = function(value) {
  return value === undefined;
};

but I need something like:

foreign import getFromUndefined :: forall a. Undefined a -> a

Is it possible to write that function in JS, and in that case, what to return when the Undefined a is really undefined? Or alternatively, can I redefine the type Undefined a to allow patern matching over it to extract the a?

1

1 Answers

1
votes

You could implement something like

foreign import fromUndefinedWithDefault :: forall a. a -> Undefined a -> a

instead by reusing what you did to define isUndefined.

The type you wrote cannot be implemented because safely, because I could use it to define

bad :: Void
bad = getFromUndefined (head [])