Excepción de referencia nula en función recursiva.
El código a continuación pertenece al capítulo 8 de https://www.manning.com/books/real-world-functional-programming
Cuando ejecuto el código, recibo una excepción de referencia nula en testClientTree. Verifiqué la errata del libro, pero no encontré nada al respecto.
“`
type Client =
{ Name : string
Income : int
YearsInJob : int
UsesCreditCard : bool
CriminalRecord : bool }
let john =
{ Name = "John Doe"
Income = 40000
YearsInJob = 1
UsesCreditCard = true
CriminalRecord = false }
type ClientTests =
{ Check : Client -> bool
Report : Client -> unit }
type QueryInfo =
{ Title : string
Test : Client -> bool
Positive : Decision
Negative : Decision }
and Decision =
| Result of string
| Query of QueryInfo
let rec tree =
Query({ Title = "Más de $40k"
Test = (fun cl -> cl.Income > 40000)
Positive = moreThan40; Negative = lessThan40 })
and moreThan40 =
Query({ Title = "Tiene antecedentes penales"
Test = (fun cl -> cl.CriminalRecord)
Positive = Result("NO"); Negative = Result("YES") })
and lessThan40 =
Query({ Title = "Años en el trabajo"
Test = (fun cl -> cl.YearsInJob > 1)
Positive = Result("YES"); Negative = usesCredit })
and usesCredit =
Query({ Title = "Utiliza tarjeta de crédito"
Test = (fun cl -> cl.UsesCreditCard)
Positive = Result("YES"); Negative = Result("NO") })
let rec testClientTree(client, tree) =
match tree with
| Result(msg) ->
printfn " OFRECER UN PRÉSTAMO: %s" msg
| Query(qi) ->
let s, case = if (qi.Test(client)) then "sí", qi.Positive
else "no", qi.Negative
printfn " – ¿%s? %s" qi.Title s
testClientTree(client, case)
[<entrypoint>]
let main argv =
testClientTree(john, tree)
0
“`
davy.ai
El problema se debe probablemente a que el caso de decisión “usesCredit” está llamando a
Result("NO")
en lugar delessThan40
. Para solucionar el problema, cambiaNegative = Result("NO")
aNegative = lessThan40
en el caso de decisión “usesCredit”.