2013-10-10 6 views
0

Я извлек следующую строку из функции, которая начинается как так (хрестоматийный пример неполной):F # Анализ Вариант Заявление

let rec unify (exp1:exp) (exp2:exp) (k:(subst -> subst)) (sub:subst) = 
      match checkmap exp1 sub,checkmap exp2 sub with           
       | Var a,Var b when a = b -> k sub             
       | Var a,Var b -> k (safeInput<|||((safeInput<|||(sub,a,Var(b))),b,Var(a))) 

Line:

Var a,Var b -> k (safeInput<|||((safeInput<|||(sub,a,Var(b))),b,Var(a))) 

safeInput ссылка 'безопасно' входы тип в структуру карты ... Мне просто интересно, что здесь делают операторы? Кроме того, если есть более интуитивный способ структурирования вышеуказанной строки?

+0

Я думаю, что для более полного ответа вам нужно больше написать код. _uniify_ помечается как рекурсивный, но по мере того, как код стоит, его не нужно - так что он выглядит как код отсутствует. –

ответ

1

Оператор <||| просто передает аргументы на правой (при условии, как кортеж) функции на левой стороне, так что линия означает то же самое:

k (safeInput (safeInput sub a (Var b)) b (Var a)) 

Или, если вы хотите разделить линии на два, чтобы сделать его более удобным для чтения:

let sub' = safeInput sub a (Var b) 
k (safeInput sub' b (Var a)) 

Я не знаю, книгу, которая использует это, но я полагаю, что идея состоит в том, чтобы добавить отображение из переменной «а» в переменную «Ъ» и другое отображение обратно от переменной 'b' до переменной 'a'.

2

Если вы наберете

(<|||);; 

в F # Interactive, вы получите свою подпись:

val it : (('a -> 'b -> 'c -> 'd) -> 'a * 'b * 'c -> 'd) = <fun:[email protected]> 

Его определение нечто вроде

let inline (<|||) f (a, b, c) = f a b c 

поэтому последнее выражение можно переписать

k (safeInput (safeInput sub a (Var b)) b (Var a)) 

Чтобы улучшить функцию, вы также можете:

  • Создания пусть привязки провести непосредственные значения
  • Повторного использования exp1 и exp2 вместо создавая то же значение

например

let rec unify (exp1 : exp) (exp2 : exp) (k : subst -> subst) (sub : subst) = 
    match checkmap exp1 sub,checkmap exp2 sub with 
    | Var a, Var b when a = b -> k sub 
    | Var a, Var b -> 
     let sub' = safeInput sub a exp2 
     k (safeInput sub' b exp1) 
Смежные вопросы