среда, 8 января 2020 г.

Функциональный типы

    Функциональный тип - тип данных значением которого является функция.

    Функциональные типы ничем не отличаются от других типов и могут быть использованы для указания типа аргумента функции, члена типа, переменной или константы.

    Для указания функционального типа, нужно написать символ @ после чего в круглых скобках, через запятую указать типы принимаемых аргументов, если аргументы изменяемые то перед типом нужно поставить двоеточие, затем если функция возвращает какое либо значение нужно написать -> Тип возвращаемого значения. Примеры:


a := @(UInt64, UInt64) -> Bool //переменная a может хранить функцию
                               //принимающую два аргумента типа UInt64
                               //и возвращающую значение типа Bool
b := @(:x) //переменная b может хранить процедуру принимающую изменяемый
           //аргумент имеющий такой же тип как и у аргумента текущей функции 
           //с именем x
с := @() //переменная c может хранить процедуру не принимающую аргументов

    В правилах можно узнавать тип аргумента функции ровно таким же образом как и с обычными типами. Для получения типа аргумента функции внутри функционального типа, нужно после имени аргумента указать в квадратных скобках номер аргумента (отсчёт начинается с 0), если в качестве номера аргумента указать символ минус, то это будет означать тип возвращаемого значения. Примеры:


proc (a, b)
    rules
        1 = a == @(_, UInt64) -> b //истина если a хранит функцию
                                   //принимающую 2 аргумента
                                   //2-й аргумент должен быть такого же типа
                                   //как и аргумент текущей функции b
        2 = b[-] == a[0] //истина если b хранит функцию результат которой
                         //имеет такой же тип, как и у первого аргумента 
                         //функции хранимой в a


    Для получения данных имеющих функциональный тип, нужно в коде написать символ @ затем proc или func (в зависимости от того, что должно хранится в данных - функция или процедура), затем в круглых скобках имя функции, затем так же в круглых скобках типы аргументов. Для вызова функции из переменной, константы или аргумента функции необходимо написать символы @ затем имя переменной, константы или аргумента функции, затем в круглых скобках выражения с аргументами.
    Создадим новую программу с именем funcType-cine, которая использует функциональные типы. Вот её код:


//функция принимает слайс и функцию принимающую аргумент
//с типом как у элементов слайса, а возвращающая Bool
//результат - слайс с элементами из первого слайса
//для которых функция во втором аргументе вернула true
func filter(slice, f)
    rules
        final = slice == [_] & f == @(slice[0]) -> Bool
        result = slice
    parse _, item <- slice
        if @f(item)
            then result += item
    if slice.string?()
        then result:setStringFlag()

proc main()
    "Hello World!".filter(@func(upper?)(UInt8)).printLn()


Программа в результате работы вернет две буквы "HW".

2 комментария:

  1. а можно ваш язык учить как первый ?

    ОтветитьУдалить
    Ответы
    1. Можно. Но на текущем этапе для новичка я бы не советовал.

      Удалить

Пожалуйста без мата и оскорблений. Если хотите сообщить об ошибках, для этого есть форма обратной связи.