Функциональный тип - тип данных значением которого является функция.
Функциональные типы ничем не отличаются от других типов и могут быть использованы для указания типа аргумента функции, члена типа, переменной или константы.
Для указания функционального типа, нужно написать символ @ после чего в круглых скобках, через запятую указать типы принимаемых аргументов, если аргументы изменяемые то перед типом нужно поставить двоеточие, затем если функция возвращает какое либо значение нужно написать -> Тип возвращаемого значения. Примеры:
В правилах можно узнавать тип аргумента функции ровно таким же образом как и с обычными типами. Для получения типа аргумента функции внутри функционального типа, нужно после имени аргумента указать в квадратных скобках номер аргумента (отсчёт начинается с 0), если в качестве номера аргумента указать символ минус, то это будет означать тип возвращаемого значения. Примеры:
Для получения данных имеющих функциональный тип, нужно в коде написать символ @ затем proc или func (в зависимости от того, что должно хранится в данных - функция или процедура), затем в круглых скобках имя функции, затем так же в круглых скобках типы аргументов. Для вызова функции из переменной, константы или аргумента функции необходимо написать символы @ затем имя переменной, константы или аргумента функции, затем в круглых скобках выражения с аргументами.
Создадим новую программу с именем funcType-cine, которая использует функциональные типы. Вот её код:
Программа в результате работы вернет две буквы "HW".
Функциональные типы ничем не отличаются от других типов и могут быть использованы для указания типа аргумента функции, члена типа, переменной или константы.
Для указания функционального типа, нужно написать символ @ после чего в круглых скобках, через запятую указать типы принимаемых аргументов, если аргументы изменяемые то перед типом нужно поставить двоеточие, затем если функция возвращает какое либо значение нужно написать -> Тип возвращаемого значения. Примеры:
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".
а можно ваш язык учить как первый ?
ОтветитьУдалитьМожно. Но на текущем этапе для новичка я бы не советовал.
Удалить