Как я могу использовать List.exists после List.map без дополнительной привязки let? - PullRequest
0 голосов
/ 23 февраля 2012
type ProcessAttachmentResult = ValidAttachment | InvalidAttachment

let processAttachment ( attachment : Attachment ) =
    if attachment.Name ="test.txt" then
       printfn "%s valid" 
       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 

Как я могу изменить последние две привязки let и сопоставить с одной привязкой?

Я пытался

attachments |> List.map processAttachment |> List.exists (fun r -> r = ValidAttachment)

, но это дает:

Ожидается, что это выражение будет иметь тип ProcessAttachmentResult list, но здесь имеет тип bool

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Как упомянуто в комментарии, нет ничего плохого в вашем подходе.Вы должны были случайно переопределить некоторые встроенные функции (например, 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)
1 голос
/ 23 февраля 2012

Похоже, вам нужно:

let emailContainsValidAttachments = 
    List.exists ( fun r -> r = ValidAttachment) (List.map attachments processAttachment)

Порядок аргументов по какой-то причине отличается в exists от map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...