вторник, 24 октября 2017 г.

Data 1. Haskell vs мои скрипты

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


Или так:


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

Комментариев нет:

Отправить комментарий