Этот вопрос расширен из моего предыдущего вопроса о изменяемом значении. Я почти уверен, что основная тема c этого вопроса, предварительное вычисление имеет много общего со связанным вопросом.
Пожалуйста, посмотрите примеры ниже, которые я привел из книги, с которой я учусь:
let isWord (words : string list) =
let wordTable = Set.ofList words // Expensive computation!
fun w -> wordTable.Contains(w)
val isWord : words:string list -> (string -> bool)
, которая принимает список строк и возвращает функцию, которая проверяет, есть ли входная строка в списке. С этой крошечной милой вспомогательной функцией, вот два примера:
let isCapital = isWord ["London"; "Paris"; "Warsaw"; "Tokyo"];;
val isCapital : (string -> bool)
let isCapitalSlow word = isWord ["London"; "Paris"; "Warsaw"; "Tokyo"] word
val isCapitalSlow : (string -> bool)
Я думал, что эти две функции делают одно и то же, но это не так. В книге говорится, что в то время как первый предварительно вычисляет набор из заданного списка, второй будет вычислять набор всякий раз, когда вызывается функция.
Как я узнал в классе PL, по порядку Чтобы оценить выражение лямбда-исчисления, каждый параметр должен быть дан телу. Отсутствие только одного не позволит выразить выражение.
Исходя из этого, я пришел к выводу, что у первого нет параметров, поэтому он может сразу начать вычислять, когда список дается, но второе не может начать оценку, пока не будет задан параметр word
. Пока все хорошо, но подумав об этом с помощью вышеупомянутого связанного вопроса, я не уверен, правильно ли я это понимаю или нет.
Думая об этом и ответе на связанный вопрос, кажется, как оценка продолжается до тех пор, пока не станет в состоянии оценить, возможно, из-за отсутствия информации, параметров или чего-либо еще. Тогда можно ли думать, что каждая не зависящая от ситуации часть выражения будет оцениваться только один раз и предварительно вычисляться, как в первом примере?
Кажется, что эта часть может сильно влияет на оптимизацию и производительность, поэтому я хочу, чтобы мое понимание этого топи c ясно.