reducir una lista de funciones a un valor booleano
Frecuentes
Visto 273 equipos
2
Estoy buscando una manera de reducir esta lista a un valor booleano. Aquí está el original:
let ones = [1;1;1;1]
let twos = [2;2;2;2]
let bad = [1;2;3]
let isAllOnes = List.forall (fun op -> op = 1)
let isAllTwos = List.forall (fun op -> op = 2)
let isOneOrTwo ops = isAllOnes ops || isAllTwos ops
isOneOrTwo ones |> should be True
isOneOrTwo twos |> should be True
isOneOrTwo bad |> should be False
Estoy tratando de refactorizar esto usando una especie de reducción. Algo como esto:
let isOneOrTwo ops = [isAllOnes; isAllTwos] |> List.tryFind (fun acc -> acc ops)
(isOneOrTwo ones).IsSome |> should be True
(isOneOrTwo twos).IsSome |> should be True
(isOneOrTwo bad).IsSome |> should be False
No me gusta cómo isOneOrTwo se reduce a una opción. Realmente me gustaría reducir la lista a un booleano para que mis afirmaciones se vean así:
isOneOrTwo ones |> should be True
isOneOrTwo twos |> should be True
isOneOrTwo bad |> should be False
¿Alguien sabe cómo hacer que esto suceda? List.reduce no funcionó porque los tipos eran diferentes.
1 Respuestas
6
Reemplace List.tryFind con List.exists
let ones = [1;1;1;1]
let twos = [2;2;2;2]
let bad = [1;2;3]
let allOnes = List.forall ((=) 1)
let allTwos = List.forall ((=) 2)
let isOneOrTwo l = [allOnes; allTwos] |> List.exists (fun f -> f l)
printfn "%A " (isOneOrTwo ones) // true
printfn "%A " (isOneOrTwo twos) // true
printfn "%A " (isOneOrTwo bad) // false
contestado el 03 de mayo de 12 a las 18:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas f# mapreduce reduce or haz tu propia pregunta.
Wow, me encanta una solución tan limpia y simple. - Onorio Catenacci