F #: Как проверить содержимое в n-кортеже и вернуть true или false? - PullRequest
0 голосов
/ 15 марта 2020

Рассмотрим этот код F #:

let isSalary employee =
    let (fName,lName,Occupation,Department,SalaryType,
         HoursPerWeek, AnnualSalary, HourlyWage
        ) = employee
    SalaryType = "Salary"
    if(employee.SalaryType = SalaryType) then 
     true
    else 
     false

Я получаю здесь ошибки, есть какие-то исправления?

1 Ответ

0 голосов
/ 15 марта 2020

Перво-наперво, пожалуйста, напишите сообщения об ошибках и гораздо более конкретный c вопрос. Спасибо! Но, к счастью, я могу вывести сообщения об ошибках из этой проблемы.

Далее, если вы хотите изменить SalaryType после деконструкции вашего employee 8 кортежа, вы должны написать, используя ключевое слово mutable :

let mutable (fName, lName, Occupation, Department, SalaryType, HoursPerWeek, AnnualSalary, HourlyWage) = employee

Но вы не должны. Это будет объяснено ниже.

Следующая проблема: нет точечной нотации (нет tuple.member) для доступа к членам кортежа. Это возможно только через деконструкцию. Таким образом, вы не можете employee.SalaryType.

Вот что, по-видимому, является сутью проблемы, и это ошибка, которую я совершал много раз, когда я изучал функциональное программирование, и это сложный сдвиг парадигмы для адаптации к , Вы не должны пытаться изменить данные или, в этом случае, переменные. Переменные или значения, как они называются в F #, не должны изменяться, как правило. Функции должны быть чистыми.

Это означает, что любые параметры, передаваемые в функцию, не должны изменяться после выхода из функции. Параметр employee должен быть таким же после того, как вы вернетесь в область вызова.

Есть несколько синтаксических ошибок, которые вы сделали, что делает для меня почти невозможным вывод, что вы пытаетесь сделать в первое место. Пожалуйста, включите это в вопрос.

Также, последний придирчивый. Как вы знаете, последнее выражение в функции F # это возвращаемое значение. Вместо использования оператора if просто верните проверяемое условие, например:

let ... ... employee.SalaryType = SalaryType <- но помните, что вы не можете использовать точечную запись в кортежах; это всего лишь пример </p>

Пожалуйста, прочитайте больше на https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/

...