data List = List a List | []
Выглядит так:
Data List
Constructor List (
Anonim ANY
Anonim List
) // List
Constructor [] ()
; // List
Или с именами полей:
Data List
Constructor List (
Named ANY Head
Named List Tail
) // List
Constructor [] ()
; // List
Или в операторном виде:
Data List
Constructor List (
Left Anonim ANY // параметр слева
Anonim List // параметр справа
) // List
Constructor [] ()
; // List
Тогда конструктор List вызывается так:
1 List 2 List []
Строит:
[ 1 2 ]
О! Я понял как pattern matching сделать.
В общем я могу сделать head:tail вместо .Split Head Tail.
aList .Split Head Tail
Можно сделать так (под капотом):
MATCH List:Make ( Head Tail )
Тут говорим, что надо применить pattern matching к конструктору List:Make и положить результаты в ( Head Tail )
А потом MATCH можно спрятать в и вычислять его в зависимости от того с какой стороны от знака равно (=) находится List:Make.
Учитывая, что "экземпляр объкта" знает про конструктор, которым он был создан, то выражение:
MATCH List:Make ( Head Tail )
можно переписать:
MATCH ( Head Tail )
LIST FUNCTION f
LIST IN aList
ANY VAR Head
LIST VAR Tail
aList .Split Head Tail
LIST:Make 1 Map ( 2 * ) Tail
>>> Result
; // f
Можно переписать так:
LIST FUNCTION f
LIST IN aList
ANY VAR Head
LIST VAR Tail
MATCH aList ( Head Tail )
LIST:Make 1 Map ( 2 * ) Tail
>>> Result
; // f
LIST FUNCTION f
LIST IN aList
ANY VAR Head
LIST VAR Tail
MATCH aList
[]
[]
( Head Tail )
( LIST:Make 1 Map ( 2 * ) Tail )
; // MATCH
>>> Result
; // f
Выглядит так:
Data List
Constructor List (
Anonim ANY
Anonim List
) // List
Constructor [] ()
; // List
Или с именами полей:
Data List
Constructor List (
Named ANY Head
Named List Tail
) // List
Constructor [] ()
; // List
Или в операторном виде:
Data List
Constructor List (
Left Anonim ANY // параметр слева
Anonim List // параметр справа
) // List
Constructor [] ()
; // List
Тогда конструктор List вызывается так:
1 List 2 List []
Строит:
[ 1 2 ]
О! Я понял как pattern matching сделать.
В общем я могу сделать head:tail вместо .Split Head Tail.
aList .Split Head Tail
Можно сделать так (под капотом):
MATCH List:Make ( Head Tail )
Тут говорим, что надо применить pattern matching к конструктору List:Make и положить результаты в ( Head Tail )
А потом MATCH можно спрятать в и вычислять его в зависимости от того с какой стороны от знака равно (=) находится List:Make.
Учитывая, что "экземпляр объкта" знает про конструктор, которым он был создан, то выражение:
MATCH List:Make ( Head Tail )
можно переписать:
MATCH ( Head Tail )
Тогда навскидку:
LIST IN aList
ANY VAR Head
LIST VAR Tail
aList .Split Head Tail
LIST:Make 1 Map ( 2 * ) Tail
>>> Result
; // f
Можно переписать так:
LIST FUNCTION f
LIST IN aList
ANY VAR Head
LIST VAR Tail
MATCH aList ( Head Tail )
LIST:Make 1 Map ( 2 * ) Tail
>>> Result
; // f
Или даже так:
LIST IN aList
ANY VAR Head
LIST VAR Tail
MATCH aList
[]
[]
( Head Tail )
( LIST:Make 1 Map ( 2 * ) Tail )
; // MATCH
>>> Result
; // f
Или так:
LIST FUNCTION f
LIST IN aList
MATCH aList
[]
[]
( ANY VAR Head
LIST VAR Tail
Head Tail )
( LIST:Make 1 Map ( 2 * ) Tail )
; // MATCH
>>> Result
; // f
LIST IN aList
MATCH aList
[]
[]
( ANY VAR Head
LIST VAR Tail
Head Tail )
( LIST:Make 1 Map ( 2 * ) Tail )
; // MATCH
>>> Result
; // f
Комментариев нет:
Отправить комментарий