LINUX.ORG.RU

[F#] apply


0

2

помогите понять почему это не верно? на сколько я знаю, карринг вполне позволяет ф-ции возвращать результаты разных типов, в зависимости от количества переданных аргументов. К примеру ф-ция (A -> B -> C) может возвращать либо (B -> C) либо C

exception MultiArgsError of string 
let rec apply f args = 
    match args with 
    | arg :: [] -> f arg
    | arg :: args ->
        apply (f arg) args        
    | [] -> raise (MultiArgsError("args count incorrect"))

Program.fs(25,16): error FS0001: Type mismatch. Expecting a
    'a -> 'b    
but given a
    'b    
The resulting type would be infinite when unifying ''a' and ''b -> 'a'

Ответ на: комментарий от korvin_

мне лишь интересно, как он вообще предлагает совместить неопределенное количество параметров и автоматическое каррирование + частичное применение

В хаскеле такое делается с помощью классов типов (Text.Printf, например).

quasimoto ★★★★
()
Ответ на: комментарий от ram

DSL в смысле? через fslex/yacc? сложно это, физически нет времени на изучение, попозже, как книгу дракона дочитаю, возьмусь, а сейчас нужно за пару дней сделать

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

DSL в смысле? через fslex/yacc? сложно это, физически нет времени на изучение, попозже, как книгу дракона дочитаю, возьмусь, а сейчас нужно за пару дней сделать

DSL в скобочках (s-выражения), парсер (интерпретатор) скобочек (уже разобранных) на F#?

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

не понял, DSL в виде s-exp? нуу спорно, ведь человек, который его будет юзать, воспротивится.

парсер (интерпретатор)

т.е. написать руками синтаксический транслятор?

(уже разобранных)

и лексический?

pseudo-cat ★★★
() автор топика

устаканил формат eDSL, пусть не так кошерно как хотелось бы ну да ладно, вот пример:

test "My simple test" starting "26.02.2012"
    whenSuccess ["Inner simple test"]
    whenWrong ["Some other test"; "And other..."]

check Targets.Principle on 
    (haveElement  
        [{name = "ТипЭлемента"; value = "предохранитель"; oftype = MatchType.eq};
         {name = "ТипПредохранителя"; value = "Плав.*"; oftype = MatchType.regex}])

check Targets.Principle on
    (haveElement 
        [{name = "Имя"; value = "ЛПТ"; oftype = MatchType.eq}])

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

забыл сказать почему - много скобок и запятых желаемые «f a b &rest c» превратились в f(a,b,c)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

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

Это я к тому, что если делать DSL, то можно обойтись без генераторов парсеров (lex/yacc) - s-выражения разбираются довольно просто. Ещё JSON можно просто реализовать (наверно, для F# уже есть готовый парсер).

т.е. написать руками синтаксический транслятор?

и лексический?

А в F# не практикуют парсеры комбинаторы? Типа, задаём такой-то ADT представляющий синтаксис нашего DSL, и пишем парсер (комбинатор) в него. Pretty-printer, интерпретатор или транслятор в сторонний язык пишутся как свёртки / рекурсия по разобранному ADT.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

s-выражения разбираются довольно просто

в случае вызова ф-ций ничего специально писать и не надо - (foo a b) законное выражение на F#

А в F# не практикуют парсеры комбинаторы?

в смысле f g x -> f(g(x))? есть операторы >> и <<. Или ленивые, как в случае lex/yacc?

пишем парсер (комбинатор) в него

ну так это и есть лексический + синтаксический анализаторы.

Pretty-printer, интерпретатор или транслятор в сторонний язык пишутся как свёртки / рекурсия по разобранному ADT.

ну а это семантические действия в узлах ADT или генератор кода

просто я к тому, что всё вместе приводит к написанию компилятора. Это интересно, но моих знаний недостаточно, чтобы написать это за пару рабочих дней ~ в общем 8-10 часов

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от quasimoto

А в F# не практикуют парсеры комбинаторы?

От чего же. Есть такие. FParsec называются.

dave ★★★★★
()
Ответ на: комментарий от pseudo-cat

в смысле f g x -> f(g(x))?

http://en.wikipedia.org/wiki/Parser_combinator, вроде parsec для Haskell.

ну так это и есть лексический + синтаксический анализаторы.

ну а это семантические действия в узлах ADT или генератор кода

Да, только в языках вроде Haskell / F# с ADT, ФВП и парсерами комбинаторами все эти вещи делаются довольно просто (http://www.quanttec.com/fparsec/tutorial.html - пример разбора JSON в конце). Конечно, зависит от DSL - если на него нет каких-то определённых ограничений, то eDSL может быть предпочтительнее (тут можно вспомнить конфиги xmonad).

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.