Skip to content

Commit 6023ae5

Browse files
Add functions to data/list and add data/list documentation
1 parent d92d59c commit 6023ae5

File tree

3 files changed

+233
-79
lines changed

3 files changed

+233
-79
lines changed

hackett-doc/scribblings/hackett/reference.scrbl

Lines changed: 209 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -637,135 +637,135 @@ The @deftech{list} type, which describes lazy linked lists. Since a list is lazy
637637
as long as the entire list is never demanded. The @racket[::] constructor is pronounced “cons”, and it
638638
is generally intended to be used infix.}
639639

640-
@defthing[head (t:forall [a] {(t:List a) t:-> (t:Maybe a)})]{
640+
@defproc[(head [xs (t:List a)]) (t:Maybe a)]{
641641

642-
Returns @racket[Just] the first element of a list, or @racket[Nothing] if the list is @racket[Nil].
642+
Returns @racket[Just] the first element of @racket[xs], or @racket[Nothing] if @racket[xs] is @racket[Nil].
643643

644644
@(hackett-examples
645645
(head {1 :: 2 :: 3 :: Nil})
646646
(head (: Nil (t:List t:Integer))))}
647647

648-
@defthing[last (forall [a] {(List a) -> (Maybe a)})]{
648+
@defproc[(last [xs (t:List a)]) (t:Maybe a)]{
649649

650-
Returns @racket[just] the last element of a list, or @racket[nothing] if the list is @racket[nil].
650+
Returns @racket[Just] the last element of @racket[xs], or @racket[Nothing] if @racket[xs] is @racket[Nil].
651651
This function is @tech[#:key "partial function"]{partial}, since it diverges on an infinitely long
652652
input, e.g. @racket[(letrec ([ones {1 :: ones}]) (last ones))].
653653

654654
@(hackett-examples
655-
(last {1 :: 2 :: 3 :: nil})
656-
(last (: nil (List Integer))))}
655+
(last {1 :: 2 :: 3 :: Nil})
656+
(last (: Nil (t:List t:Integer))))}
657657

658-
@defthing[tail (forall [a] {(List a) -> (Maybe (List a))})]{
658+
@defproc[(tail [xs (t:List a)]) (t:Maybe (t:List a))]{
659659

660-
Returns @racket[Just] a list without its first element, or @racket[Nothing] if the list is
660+
Returns @racket[Just] @racket[xs] without its first element, or @racket[Nothing] if @racket[xs] is
661661
@racket[Nil].
662662

663663
@(hackett-examples
664664
(tail {1 :: 2 :: 3 :: Nil})
665665
(tail (: Nil (t:List t:Integer))))}
666666

667-
@defthing[init (forall [a] {(List a) -> (Maybe a)})]{
667+
@defproc[(init [xs (t:List a)]) (t:Maybe a)]{
668668

669-
Returns @racket[just] a list without its the last element, or @racket[nothing] if the list is
670-
@racket[nil]. This function is @tech[#:key "partial function"]{partial}, since it diverges on an
671-
infinitely long input, e.g. @racket[(letrec ([ones {1 :: ones}]) (last ones))].
669+
Returns @racket[Just] @racket[xs] without its the last element, or @racket[Nothing] if @racket[xs] is
670+
@racket[Nil]. This function is @tech[#:key "partial function"]{partial}, since it diverges on an
671+
infinitely long input, e.g. @racket[(letrec ([ones {1 :: ones}]) (init ones))].
672672

673673
@(hackett-examples
674-
(init {1 :: 2 :: 3 :: nil})
675-
(init (: nil (List Integer))))}
674+
(init {1 :: 2 :: 3 :: Nil})
675+
(init (: Nil (t:List t:Integer))))}
676676

677-
@defthing[head! (forall [a] {(List a) -> a})]{
677+
@defproc[(head! [xs (List a)]) a]{
678678

679-
A @tech[#:key "partial function"]{partial} version of @racket[head] that returns the first element of
680-
a list. If the list is empty, it raises an error.
679+
A @tech[#:key "partial function"]{partial} version of @racket[head] which returns the first element of
680+
@racket[xs]. If @racket[xs] is empty, @racket[head!] raises an error.
681681

682682
@(hackett-examples
683683
(head! {1 :: 2 :: 3 :: Nil})
684684
(eval:error (head! (: Nil (t:List t:Integer)))))}
685685

686-
@defthing[last! (forall [a] {(List a) -> a})]{
686+
@defproc[(last! [xs (t:List a)]) a]{
687687

688-
A less-safe version of @racket[last] which tries to return the last element of any list. This function
689-
is @tech[#:key "partial function"]{partial}; if the given list is empty, @racket[last!] raises an
690-
error, and if the list is infinitely long, the function wil not return.
688+
A less-safe version of @racket[last] which returns the last element of @racket[xs]. This function
689+
is @tech[#:key "partial function"]{partial}, since when @racket[xs] is empty, @racket[last!] raises
690+
an error, and if @racket[xs] is infinitely long, @racket[last!] will never return.
691691

692692
@(hackett-examples
693-
(last! {1 :: 2 :: 3 :: nil})
694-
(eval:error (last! (: nil (List Integer)))))}
693+
(last! {1 :: 2 :: 3 :: Nil})
694+
(eval:error (last! (: Nil (t:List t:Integer)))))}
695695

696-
@defthing[tail! (forall [a] {(List a) -> (List a)})]{
696+
@defproc[(tail! [xs (t:List a)]) (t:List a)]{
697697

698-
A @tech[#:key "partial function"]{partial} version of @racket[tail] that returns a list without its
699-
first element. If the list is empty, it raises an error.
698+
A @tech[#:key "partial function"]{partial} version of @racket[tail] that returns @racket[xs] without
699+
its first element. If @racket[xs] is empty, @racket[tail!] raises an error.
700700

701701
@(hackett-examples
702702
(tail! {1 :: 2 :: 3 :: Nil})
703703
(eval:error (tail! (: Nil (t:List t:Integer)))))}
704704

705-
@defthing[init! (forall [a] {(List a) -> a})]{
705+
@defproc[(init! [xs (t:List a)]) a]{
706706

707-
A less-safe version of @racket[init] which tries to return the last element of any list. This function
708-
is @tech[#:key "partial function"]{partial}; if the given list is empty, @racket[init!] raises an
709-
error, and if the list is infinitely long, the function wil not return.
707+
A less-safe version of @racket[init] which returns the last element of @racket[xs]. This function
708+
is @tech[#:key "partial function"]{partial}, since when @racket[xs] is empty, @racket[init!] raises an
709+
error, and if @racket[xs] is infinitely long, @racket[init!] will never return.
710710

711711
@(hackett-examples
712-
(init! {1 :: 2 :: 3 :: nil})
713-
(eval:error (init! (: nil (List Integer)))))}
712+
(init! {1 :: 2 :: 3 :: Nil})
713+
(eval:error (init! (: Nil (t:List t:Integer)))))}
714714

715-
@defthing[uncons (forall [a] {(List a) -> (Maybe (Tuple a (List a)))})]{
715+
@defproc[(uncons [xs (t:List a)]) (t:Maybe (t:Tuple a (t:List a)))]{
716716

717-
Returns @racket[nothing] if the list is @racket[nil], and @racket[just] a pair of the list's first
718-
element and the rest of it otherwise.
717+
When @racket[xs] is @racket[Nil], @racket[uncons xs] is @racket[Nothing]. Otherwise, if @racket[xs]
718+
is @racket[{y :: ys}] then @racket[uncons xs] is @racket[Just (Tuple y ys)].
719719

720720
@(hackett-examples
721-
(uncons {1 :: 2 :: 3 :: nil})
722-
(uncons (: nil (List Integer))))}
721+
(uncons {1 :: 2 :: 3 :: Nil})
722+
(uncons (: Nil (t:List t:Integer))))}
723723

724-
@defthing[uncons! (forall [a] {(List a) -> (Tuple a (List a))})]{
724+
@defproc[(uncons! [xs (t:List a)]) (t:Tuple a (t:List a))]{
725725

726-
A @tech[#:key "partial function"]{partial} version of @racket[uncons] that returns a pair of the
727-
list's first element and the rest of it. If the list is empty, it raises an error.
726+
A @tech[#:key "partial function"]{partial} version of @racket[uncons] that returns
727+
@racket[Tuple (head! xs) (tail! xs)]. If @racket[xs] is empty, it instead raises an error.
728728

729729
@(hackett-examples
730-
(uncons! {1 :: 2 :: 3 :: nil})
731-
(eval:error (uncons! (: nil (List Integer)))))}
730+
(uncons! {1 :: 2 :: 3 :: Nil})
731+
(eval:error (uncons! (: Nil (t:List t:Integer)))))}
732732

733-
@defthing[null? (forall [a] {(List a) -> Bool})]{
733+
@defproc[(nil? [xs (t:List a)]) (t:Bool)]{
734734

735-
This predicate is @racket[true] when its argument is of the form @racket[nil], and is false otherwise.
735+
This predicate is @racket[True] when @racket[xs] is of the form @racket[Nil], and is false otherwise.
736736

737737
@(hackett-examples
738-
(null? {1 :: 2 :: 3 :: nil})
739-
(null? (: nil (List Integer))))}
738+
(nil? {1 :: 2 :: 3 :: Nil})
739+
(nil? (: Nil (t:List t:Integer))))}
740740

741-
@defthing[length (forall [a] {(List a) -> Integer})]
741+
@defproc[(length [xs (t:List a)]) t:Integer]{
742742

743-
Returns the length of a finite list. Since the function will diverge on an infinitely long input,
744-
@racket[length] is @tech[#:key "partial function"]{partial}.
743+
Returns the length of @racket[xs] when @racket[xs] is finite. Since the function diverges on an
744+
infinitely long input, @racket[length] is @tech[#:key "partial function"]{partial}.
745745

746746
@(hackett-examples
747-
(length {1 :: 2 :: 3 :: nil})
748-
(length (: nil (List Integer))))}
747+
(length {1 :: 2 :: 3 :: Nil})
748+
(length (: Nil (t:List t:Integer))))}
749749

750-
@defproc[(take [n Integer] [xs (List a)]) (List a)]{
750+
@defproc[(take [n t:Integer] [xs (t:List a)]) (t:List a)]{
751751

752752
Produces a list with the first @racket[n] elements of @racket[xs]. If @racket[xs] contains fewer than
753753
@racket[n] elements, @racket[xs] is returned unmodified.
754754

755755
@(hackett-examples
756-
(take 2 {1 :: 2 :: 3 :: nil})
757-
(take 2 {1 :: nil})
758-
(take 2 (: nil (List Integer))))}
756+
(take 2 {1 :: 2 :: 3 :: Nil})
757+
(take 2 {1 :: Nil})
758+
(take 2 (: Nil (t:List t:Integer))))}
759759

760760
@defproc[(drop [n t:Integer] [xs (t:List a)]) (t:List a)]{
761761

762762
Produces a list like @racket[xs] without its first @racket[n] elements. If @racket[xs] contains fewer
763763
then @racket[n] elements, the result is @racket[Nil].
764764

765765
@(hackett-examples
766-
(drop 2 {1 :: 2 :: 3 :: nil})
767-
(drop 2 {1 :: nil})
768-
(drop 2 (: nil (List Integer))))}
766+
(drop 2 {1 :: 2 :: 3 :: Nil})
767+
(drop 2 {1 :: Nil})
768+
(drop 2 (: Nil (t:List t:Integer))))}
769769

770770
@defproc[(filter [f {a t:-> t:Bool}] [xs (t:List a)]) (t:List a)]{
771771

@@ -816,13 +816,161 @@ Adds the elements of @racket[xs] together and returns the sum. Equivalent to @ra
816816
(eval:check (sum {1 :: 2 :: 3 :: Nil}) 6)
817817
(eval:check (sum Nil) 0))}
818818

819-
@defthing[intersperse (forall [a] {a -> (List a) -> (List a)})]{
819+
@defproc[(reverse (xs (t:List a))) (t:List a)]{
820+
821+
Returns @racket[xs] in reversed order.
822+
823+
@(hackett-examples
824+
(reverse {1 :: 2 :: 3 :: Nil})
825+
(reverse (: Nil (t:List t:Integer))))}
826+
827+
@defproc[(zip-with [f {a t:-> b t:-> c}] [as (t:List a)] [bs (t:List b)]) (t:List c)]{
828+
829+
This function will apply @racket[f] to each element in @racket[as] and @racket[bs] until it
830+
has reached the end of either, then it returns a list like
831+
@racket[{f _a0 _b0 :: f _a1 _b1 :: f _a2 _b2 :: ... :: Nil}] (where @racket[as] contains
832+
elements named @racket[_a0], @racket[_a1], @racket[_a2] etc., and @racket[bs] contains elements
833+
named @racket[_b0], @racket[_b1], @racket[_b2] etc.).
834+
835+
@(hackett-examples
836+
(zip-with + {1 :: 2 :: 3 :: Nil} {18 :: 42 :: 50 :: Nil})
837+
(zip-with + {1 :: 2 :: 3 :: Nil} {18 :: 42 :: 50 :: 100 :: Nil})
838+
(zip-with + {1 :: 2 :: 3 :: 4 :: Nil} {18 :: 42 :: 50 :: Nil})
839+
(zip-with * {1 :: 2 :: 3 :: Nil} {18 :: 42 :: 50 :: Nil})
840+
(zip-with + (: Nil (t:List t:Integer)) (: Nil (t:List t:Integer))))}
841+
842+
@defproc[(zip [as (t:List a)] [bs (t:List b)]) (t:List (t:Tuple a b))]{
843+
844+
Returns a list of componenetwise pairs from @racket[as] and @racket[bs]. The length of this list is
845+
the length of the shortest input list. Equivalent to @racket[(zip-with Tuple as bs)].
846+
847+
@(hackett-examples
848+
(zip {1 :: 2 :: 3 :: Nil} {18 :: 42 :: 50 :: Nil})
849+
(zip {1 :: 2 :: 3 :: Nil} {18 :: 42 :: 50 :: 100 :: Nil})
850+
(zip {1 :: 2 :: 3 :: 4 :: Nil} {18 :: 42 :: 50 :: Nil})
851+
(zip (: Nil (t:List t:Integer)) (: Nil (t:List t:Integer))))}
852+
853+
@defproc[(repeat [x a]) (t:List a)]{
854+
855+
Returns an infinite list containing only @racket[x].
856+
857+
@(hackett-examples
858+
(take 5 (repeat 1)))}
859+
860+
@defproc[(cycle! [xs (t:List a)]) (t:List a)]{
861+
862+
Returns the infinite list @racket[{xs ++ xs ++ xs ++ ...}]. If @racket[xs] is infinite,
863+
@racket[cycle! xs == xs]. This function is @tech[#:key "partial function"]{partial},
864+
because it errors when given @racket[Nil].
865+
866+
@(hackett-examples
867+
(take 10 (cycle! {1 :: 2 :: 3 :: Nil}))
868+
(eval:error (cycle! (: Nil (t:List t:Integer)))))}
869+
870+
@defproc[(or [xs (t:List t:Bool)]) t:Bool]{
871+
872+
Logically ors the elements of @racket[xs] together and returns the result. Equivalent to @racket[(foldr || False)].
873+
Because it uses a right fold, the only elements which will be evaluated are those before the first expression which
874+
evaluates to @racket[True]. Additionally, @racket[or infinite-list] can never return @racket[False], and
875+
@racket[or (repeat False)] will never terminate.
876+
877+
@(hackett-examples
878+
(or {True :: False :: Nil})
879+
(or {False :: True :: Nil})
880+
(or {True :: (error! "never happens") :: Nil})
881+
(or Nil))}
882+
883+
@defproc[(and [xs (t:List t:Bool)]) t:Bool]{
884+
885+
Logically ands the elements of @racket[xs] together and returns the result. Equivalent to @racket[(foldr && True)].
886+
Because it uses a right fold, the only elements which will be evaluated are those before the first expression which
887+
evaluates to @racket[False]. Additionally, @racket[and infinite-list] can never return @racket[True], and
888+
@racket[and (repeat True)] will never terminate.
889+
890+
@(hackett-examples
891+
(and {True :: False :: Nil})
892+
(and {False :: True :: Nil})
893+
(and {False :: (error! "never happens") :: Nil})
894+
(and Nil))}
895+
896+
@defproc[(any? [p {a t:-> t:Bool}] [xs (t:List t:Bool)]) t:Bool]{
897+
898+
Returns @racket[True] if @racket[xs] contains an element @racket[x] such that @racket[(p x)] is
899+
@racket[True]. Equivalent to @racket[(or (map p xs))].
900+
901+
@(hackett-examples
902+
(any? (<= 2) {1 :: 2 :: 3 :: Nil})
903+
(any? (<= 4) {1 :: 2 :: 3 :: Nil})
904+
(any? (<= 0) {1 :: (error! "never happens") :: Nil})
905+
(any? (<= 0) Nil))}
906+
907+
@defproc[(all? [p {a t:-> t:Bool}] [xs (t:List t:Bool)]) t:Bool]{
908+
909+
Returns @racket[True] if for every element @racket[x] of @racket[xs] @racket[(p x)] is
910+
@racket[True]. Equivalent to @racket[(and (map p xs))].
911+
912+
@(hackett-examples
913+
(all? (<= 1) {1 :: 2 :: 3 :: Nil})
914+
(all? (<= 2) {1 :: 2 :: 3 :: Nil})
915+
(all? (<= 2) {1 :: (error! "never happens") :: Nil})
916+
(all? (<= 1) Nil))}
917+
918+
@defproc[(elem? [_ (t:Eq a)] [x a] [xs (t:List a)]) t:Bool]{
919+
920+
Returns @racket[True] if @racket[xs] contains @racket[x]. Equivalent to @racket[(any? (== x) xs)].
921+
Only elements to the left of the first expression equal to @racket[x] in @racket[xs] will be checked
922+
for equality.
923+
924+
@(hackett-examples
925+
(elem? 2 {1 :: 2 :: 3 :: Nil})
926+
(elem? 0 {1 :: 2 :: 3 :: Nil})
927+
(elem? 1 {1 :: (error! "never happens") :: Nil})
928+
(elem? 1 Nil))}
929+
930+
@defproc[(not-elem? [_ (t:Eq a)] [x a] [xs (t:List a)]) t:Bool]{
931+
932+
Returns @racket[False] if @racket[xs] contains @racket[x]. Equivalent to @racket[(not (elem? x xs))].
933+
Only elements to the left of the first expression equal to @racket[x] in @racket[xs] will be checked
934+
for equality.
935+
936+
@(hackett-examples
937+
(elem? 2 {1 :: 2 :: 3 :: Nil})
938+
(elem? 0 {1 :: 2 :: 3 :: Nil})
939+
(elem? 1 {1 :: (error! "never happens") :: Nil})
940+
(elem? 1 Nil))}
941+
942+
@defproc[(delete [_ (t:Eq a)] [x a] [xs (t:List a)]) (t:List a)]{
943+
944+
Returns @racket[xs] with the first occurrence of @racket[x] removed. Equivalent to
945+
@racket[(delete-by == x xs)]. Only elements to the left of the first expression equal to @racket[x]
946+
in @racket[xs] will be checked for equality.
947+
948+
@(hackett-examples
949+
(delete 2 {1 :: 2 :: 3 :: Nil})
950+
(delete 0 {1 :: 2 :: 3 :: Nil})
951+
(head (delete 1 {1 :: 2 :: (error! "never happens") :: Nil}))
952+
(delete 1 Nil))}
953+
954+
@defproc[(delete-by [rel {a t:-> a t:-> t:Bool}] [x a] [xs (t:List a)]) (t:List a)]{
955+
956+
Finds the first element @racket[y] such that @racket[{y rel x}] and returns @racket[xs] with
957+
@racket[y] removed. Generalizes @racket[delete]. Only elements to the left of the first expression
958+
such @racket[y] will be checked for equality.
959+
960+
@(hackett-examples
961+
(delete-by > 2 {1 :: 2 :: 3 :: Nil})
962+
(delete-by > 0 {1 :: 2 :: 3 :: Nil})
963+
(head (delete-by not= 1 {1 :: 2 :: (error! "never happens") :: Nil}))
964+
(delete-by (λ [y x] {(remainder! y x) == 0}) 2 Nil)
965+
(delete-by (error! "never happens") (error! "never happens") (: Nil (t:List t:Integer))))}
966+
967+
@defproc[(intersperse [x a] [xs (t:List a)]) (t:List a)]{
820968

821969
Given a separator and a list, intersperse intersperses the separator between each element of the list.
822970

823971
@(hackett-examples
824-
(intersperse 42 {1 :: 2 :: 3 :: nil})
825-
(intersperse 42 nil))}
972+
(intersperse 42 {1 :: 2 :: 3 :: Nil})
973+
(intersperse 42 Nil))}
826974

827975
@section[#:tag "reference-typeclasses"]{Typeclasses}
828976

0 commit comments

Comments
 (0)