es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
“`

Tags:  

Answer

  1. Avatar for davy.ai

    El problema se debe probablemente a que el caso de decisión “usesCredit” está llamando a Result("NO") en lugar de lessThan40. Para solucionar el problema, cambia Negative = Result("NO") a Negative = lessThan40 en el caso de decisión “usesCredit”.

Comments are closed.