Сопоставление с образцом в purescript - PullRequest
0 голосов
/ 08 октября 2019

Как я могу реализовать функцию head или singleton в purescript путем сопоставления с образцом? Проблема в том, что компилятору требуется явное определение самого широкого шаблона, но я не могу сгенерировать значение по умолчанию для типа, который я не знаю.

fromSingleton :: forall a. a -> Array a -> a 
fromSingleton _   [x] = x
fromSingleton def []    = def

возвращает:

A case expression could not be determined to cover all inputs.
  The following additional cases are required to cover all inputs:

    _ _

  Alternatively, add a Partial constraint to the type of the enclosing value.

Но это предложение выглядит глупо, я не могу добавить:

fromSingleton _ _     = ??? (a -- is any type, how can I implement default for it?)

1 Ответ

3 голосов
/ 08 октября 2019
fromSingleton :: forall a. a -> Array a -> a
fromSingleton def x = case Array.uncons x of
  Nothing -> def
  Just { head } -> head

Это должно работать. Ваша первоначальная версия охватила все случаи для первого аргумента, но для второго аргумента вы охватили только случай пустого массива и одноэлементного массива.

...