У меня есть некоторые повторения кода, что я действительно хочу, чтобы избавиться от -Как абстрагироваться над деструктуризацией в F #
// here's some lib code the repetitive code relies on...
module Option
let definitize opts = List.choose id opts
// here's the start of another file...
module Ast
type Expr =
| Violation of Expr
| Boolean of bool
| String of string
// here's the repetitive code...
let exprToOptViolation expr = match expr with | Violation v -> Some v | _ -> None
let exprToOptBoolean expr = match expr with | Boolean b -> Some b | _ -> None
let exprToOptStr expr = match expr with | String n -> Some n | _ -> None
let exprsToOptViolationStrs exprs = List.map exprToOptViolation exprs
let exprsToOptBools exprs = List.map exprToOptBoolean exprs
let exprsToOptStrs exprs = List.map exprToOptStr exprs
let exprsToViolationStrs exprs =
let optViolationStrs = exprsToOptViolationStrs exprs
let violationStrs = Option.definitize optViolationStrs
(optViolationStrs, violationStrs)
let exprsToBools exprs =
let optBools = exprsToOptBools exprs
let bools = Option.definitize optBools
(optBools, bools)
let exprsToStrs exprs =
let optStrs = exprsToOptStrs exprs
let strs = Option.definitize optStrs
(optStrs, strs)
Как вы можете видеть, это тот же самый алгоритм повторяется 3 раза. Однако я не знаю, как обобщить код, который требует прохождения объекта деструкции, например match expr with | destructureFn a -> Some a | _ -> None
. Может кто-нибудь помочь? У меня на самом деле есть 5 повторений в моем коде (и растет), которые нужно учесть.
Cheers!
* ЗАКЛЮЧЕНИЕ *
Используя ответ Desco, я уже достиг этого рефакторинга -
let exprsToValues exprToOptValue exprs =
let optValues = List.map exprToOptValue exprs
let values = Option.definitize optValues
(optValues, values)
let exprsToViolationStrs exprs = exprsToValues (fun expr -> match expr with | Violation v -> Some v | _ -> None) exprs
let exprsToBools exprs = exprsToValues (fun expr -> match expr with | Boolean b -> Some b | _ -> None) exprs
let exprsToStrs exprs = exprsToValues (fun expr -> match expr with | String s -> Some s | _ -> None) exprs
Благодаря Desco!
Пожалуйста, покажите свои типы. – Daniel
Готово. Пожалуйста, дайте мне знать, сохраняются ли предположения о нижеследующем ответе. –
Решение desco будет работать. Вы можете опустить 'definitize' и вместо этого использовать' List.choose id'. – Daniel