Как упомянуто в комментарии, нет ничего плохого в вашем подходе.Вы должны были случайно переопределить некоторые встроенные функции (например, List.exists
).Чтобы проверить это, попробуйте открыть новый файл сценария F # и вставьте следующий код.
По сути, это ваш код с добавленными недостающими объявлениями, и он отлично проверяет тип:
type ProcessAttachmentResult = ValidAttachment | InvalidAttachment
type Attachment = { Name : string }
let attachments = []
let move a b = ()
let email = 0
let toProcessedFolder = ""
let toErrorFolder = ""
let processAttachment ( attachment : Attachment ) =
if attachment.Name = "test.txt" then
printfn "%s valid" // TOMAS: Minor issue here - you missed the argument
ValidAttachment
else
printfn "%s invalid" attachment.Name
InvalidAttachment
// attachments is of type List<Attachment>
let processedAttachments = attachments |> List.map processAttachment
// ProcessAttachmentResult list
let emailContainsValidAttachments =
List.exists ( fun r -> r = ValidAttachment) processedAttachments
match emailContainsValidAttachments with
| true -> move email toProcessedFolder
| _ -> move email toErrorFolder
// TOMAS: No problem here - this type-checks without errors
attachments
|> List.map processAttachment
|> List.exists ( fun r -> r = ValidAttachment)