Меня интересуют альтернативные прелюдии.Я понимаю, что есть много вариантов:
- https://hackage.haskell.org/packages/#cat:Prelude
- https://guide.aelve.com/haskell/alternative-preludes-zr69k1hc
Я понимаю одну простую вещь, которую многие из них исправляют, это текст,а другой - в функциях, подобных head
, эта ошибка довольно сложна, когда вы можете предпочесть, чтобы они были безопаснее.
Однако, когда я пытаюсь использовать эти альтернативы, поведение в head
, хм, кажется просто нарушаетсяфункция полностью, и не выглядит как улучшение для меня.Вот несколько примеров:
Прелюдия
Prelude> head [1]
1
Prelude> head []
*** Exception: Prelude.head: empty list
Основание
Foundation> head [1]
<interactive>:6:6: error:
• Couldn't match expected type ‘NonEmpty c’
with actual type ‘[Integer]’
• In the first argument of ‘head’, namely ‘[1]’
In the expression: head [1]
In an equation for ‘it’: it = head [1]
• Relevant bindings include
it :: foundation-0.0.21:Foundation.Collection.Element.Element c
(bound at <interactive>:6:1)
Foundation> head []
<interactive>:7:6: error:
• Couldn't match expected type ‘NonEmpty c’ with actual type ‘[a0]’
• In the first argument of ‘head’, namely ‘[]’
In the expression: head []
In an equation for ‘it’: it = head []
• Relevant bindings include
it :: foundation-0.0.21:Foundation.Collection.Element.Element c
(bound at <interactive>:7:1)
Сейф
Safe> head []
<interactive>:22:1: error: Variable not in scope: head :: [a0] -> t
Классная прелюдия
ClassyPrelude> head [1]
<interactive>:24:6: error:
• Couldn't match expected type ‘NonNull mono’
with actual type ‘[Integer]’
• In the first argument of ‘head’, namely ‘[1]’
In the expression: head [1]
In an equation for ‘it’: it = head [1]
• Relevant bindings include
it :: Element mono (bound at <interactive>:24:1)
Relude
Relude> head [1]
<interactive>:27:6: error:
• Couldn't match expected type ‘NonEmpty a’
with actual type ‘[Integer]’
• In the first argument of ‘head’, namely ‘[1]’
In the expression: head [1]
In an equation for ‘it’: it = head [1]
• Relevant bindings include it :: a (bound at <interactive>:27:1)
Rio
RIO> head [1]
<interactive>:7:1: error:
Variable not in scope: head :: [Integer] -> t
Protolude
Protolude> head [1]
Just 1
Protolude> head []
Nothing
Это выглядит хорошо --- это также работает для хвоста, верно?
Protolude> tail [1]
<interactive>:12:1: error:
• Variable not in scope: tail :: [Integer] -> t
• Perhaps you meant ‘tails’ (imported from Protolude)
Protolude> tails [1]
[[1],[]]
Protolude> tails []
[[]]
Ну, это не полная замена.
Чего мне не хватает, почему это лучше, почему эти функции были определены, если они просто потерпят неудачу?