Haskell-подобный диапазон в PureScript? - PullRequest
0 голосов
/ 17 мая 2019

Есть ли встроенная функция, которая ведет себя как диапазон Хаскелла?

Я обнаружил, что 2..1 возвращает список [2, 1] в PureScript, в отличие от [2..1] Хаскелла, возвращающего пустой список []. После поиска в Google я обнаружил, что поведение написано в документации Отличия от Haskell , но это не дает обоснования.

На мой взгляд, это поведение несколько неудобно / не интуитивно понятно, поскольку 0 .. (len - 1) не дает пустой список, когда len равен нулю, и это может привести к загадочным ошибкам.

  1. Есть ли способ получить ожидаемый массив (то есть диапазон длины len с шагом 0), не обрабатывая каждый раз случай length == 0?
  2. Кроме того, почему PureScript решил заставить диапазон вести себя так?

P.S. Как я столкнулся с этим вопросом: я хотел написать функцию getLocalStorageKeys, которая получает все ключи из локального хранилища. Моя реализация получает количество ключей с помощью функции length , создает диапазон от 0 до numKeys - 1, а затем обходит его с помощью функции key . Однако диапазон не вел себя так, как я ожидал.

1 Ответ

0 голосов
/ 17 мая 2019

Как насчет сделать это самостоятельно?

indicies :: Int -> Array Int
indicies n = if n <= 0 then [] else 0..(n-1)

Что касается «почему», я могу только догадываться, и мои предположения состоят в том, что идея состояла в том, чтобы избежать такого рода if логики для создания «обратных» диапазонов - что-то, что действительно подходит мне в Haskell время от времени.

...