Ранее я просил дать отзыв о моем первом проекте F #. Прежде чем закрыть вопрос, потому что область была слишком большой, кто-то был достаточно любезен, чтобы просмотреть его и оставить отзыв.
Одна из вещей, которые они упомянули, указала на то, что у меня есть ряд регулярных функций, которые можно преобразовать в методы для моих типов данных. К счастью, я изменил такие вещи, как
let getDecisions hand =
let (/=/) card1 card2 = matchValue card1 = matchValue card2
let canSplit() =
let isPair() =
match hand.Cards with
| card1 :: card2 :: [] when card1 /=/ card2 -> true
| _ -> false
not (hasState Splitting hand) && isPair()
let decisions = [Hit; Stand]
let split = if canSplit() then [Split] else []
let doubleDown = if hasState Initial hand then [DoubleDown] else []
decisions @ split @ doubleDown
к этому:
type Hand
// ...stuff...
member hand.GetDecisions =
let (/=/) (c1 : Card) (c2 : Card) = c1.MatchValue = c2.MatchValue
let canSplit() =
let isPair() =
match hand.Cards with
| card1 :: card2 :: [] when card1 /=/ card2 -> true
| _ -> false
not (hand.HasState Splitting) && isPair()
let decisions = [Hit; Stand]
let split = if canSplit() then [Split] else []
let doubleDown = if hand.HasState Initial then [DoubleDown] else []
decisions @ split @ doubleDown
Теперь, я не сомневаюсь, что я идиот, но кроме (я предполагаю) облегчения взаимодействия с C #, что меня это задело? В частности, я нашел пару dis преимуществ, не считая дополнительной работы по конверсии (которую я не буду считать, поскольку я мог бы сделать это, во-первых, я полагаю, хотя это имело бы сделал с помощью F # Interactive больше боли). Во-первых, я больше не могу легко работать с функцией конвейерной обработки. Мне пришлось пойти и изменить some |> chained |> calls
на (some |> chained).Calls
и т. Д. Кроме того, казалось, что моя система типов стала еще тупее - в то время как в моей исходной версии моя программа не нуждалась в аннотациях типов, после преобразования в основном в методы-члены я куча ошибок о неопределенности поисков в этот момент, и мне пришлось пойти и добавить аннотации типов (пример этого в (/=/)
выше).
Надеюсь, я не слишком сомневался, так как я ценю полученный совет, и написание идиоматического кода важно для меня. Мне просто любопытно, почему идиома такая, какая она есть:
Спасибо!