Hva er en god måte å skrive en F # Type Provider for Microsofts Luis?

stemmer
3

Å ha en lek med Microsofts Luis + bot rammeverk, min dette ville gjøre en god type leverandør følelse i gang kribling. Dessverre typen leverandører kan ikke utgang diskriminert fagforeninger. Jeg hadde håpet å gjøre noe som følgende, men det er ikke mulig:

type Luis = LuisProvider<@LuisId,@LuisPasskey>
let IntentMatcher Intent =
    match intent with
    | Luis.Intents.Greeting -> GreetingHandler()
    | Luis.Intents.SetAlarm title startDate startTime -> AlarmHandler title startDate startTime
    | _ -> CouldNotUnderstand()

Luis hensikter og deres parametere er tilgjengelig via Apis gjør dem gode kandidater for typeProviderization

For referanse her er et behandlingsprogram fra et eksempel C # bot (som jeg tror kan være renere og mer typen trygg i F #):

public const string Entity_Alarm_Title = builtin.alarm.title;
public const string Entity_Alarm_Start_Time = builtin.alarm.start_time;
public const string Entity_Alarm_Start_Date = builtin.alarm.start_date;
public const string DefaultAlarmWhat = default;

[LuisIntent(builtin.intent.alarm.set_alarm)]
public async Task SetAlarm(IDialogContext context, LuisResult result)
{
        EntityRecommendation title;
        if (!result.TryFindEntity(Entity_Alarm_Title, out title))
        {
            title = new EntityRecommendation(type: Entity_Alarm_Title) { Entity = DefaultAlarmWhat };
        }
        EntityRecommendation date;
        if (!result.TryFindEntity(Entity_Alarm_Start_Date, out date))
        {
            date = new EntityRecommendation(type: Entity_Alarm_Start_Date) { Entity = string.Empty };
        }
        EntityRecommendation time;
        if (!result.TryFindEntity(Entity_Alarm_Start_Time, out time))
        {
            time = new EntityRecommendation(type: Entity_Alarm_Start_Time) { Entity = string.Empty };
        }
        var parser = new Chronic.Parser();
        var span = parser.Parse(date.Entity +   + time.Entity);
        if (span != null)
        {
            var when = span.Start ?? span.End;
            var alarm = new Alarm() { What = title.Entity, When = when.Value };
            this.alarmByWhat[alarm.What] = alarm;
            string reply = $alarm {alarm} created;
            await context.PostAsync(reply);
        }
        else
        {
            await context.PostAsync(could not find time for alarm);
        }
        context.Wait(MessageReceived);
}

Allikevel er spørsmålet: er det noen med mer erfaring med å bygge typen tilbydere har noen gode ideer om hvordan jeg kan strukturere en lesbar dsl som faktisk er mulig å bygge?

Publisert på 19/08/2016 klokken 09:54
kilden bruker
På andre språk...                            


1 svar

stemmer
7

Jeg er ikke spesielt kjent med bot rammeverk, men jeg kan kommentere diskriminert fagforeninger - vi står overfor lignende problem i F # data.

Hvis du har <One name="string" /><Two id="42" />, ville det være fint å gi diskriminert union med saker One of stringog Two of int. Hva vi gjør i stedet er at vi gir en type:

type OneOrTwo =
  member One : option<string>
  member Two : option<int>

Du kan følge samme mønster og avsløre API som ser omtrent slik ut:

type Luis = LuisProvider<"LuisId", "LuisPasskey">

let intentMatcher (intent:Luis.Intents) =
  match intent.Greetings, intent.SetAlarm with
  | Some(), _ -> greetingHandler()
  | _, Some(title, startDate, startTime) -> alarmHandler title startDate startTime
  | _ -> couldNotUnderstand()

Luis.Connect().OnIntent
|> Observable.subscribe intentMatcher

Det er ikke fullt så elegant som diskriminerte fagforeninger, men det bør være teknisk gjennomførbart.

Jeg antar at en annen alternativ ville være å utsette handlers for de enkelte handlinger som separate hendelser, og deretter kan du skrive noe sånt som dette:

type Luis = LuisProvider<"LuisId", "LuisPasskey">

let luis = Luis.Connect()

luis.BuiltIn.Greetings 
|> Observable.add greetingHandler

luis.BuiltIn.SetAlarm 
|> Observable.add (fun (title, startDate, startTime) -> 
     alarmHandler title startDate startTime)

Nå som jeg tenker på det, vil dette trolig være bedre, men det avhenger av hva slags bruker er typisk for bot rammeverk.

Svarte 19/08/2016 kl. 10:47
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more