2012-02-23 2 views
0
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 

Как я могу изменить два последних привязанных привязки и сопоставить одно привязку?Как я могу использовать List.exists после List.map без дополнительной привязки?

я попытался

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

, но это дает:

Это выражение, как ожидается, иметь тип ProcessAttachmentResult list но здесь имеет тип bool

+1

Ваш подход прекрасно. Вы переопределили «List.exists» или «List.map» где-нибудь? – pad

ответ

2

Как упоминалось в комментарии, нет ничего плохого в вашем подходе. Возможно, вы случайно переопределили встроенную функцию (например, 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) 
+0

Действительно, это тоже работает. Спасибо – user1120753

1

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

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

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

Смежные вопросы