类型错误,对象是不适用(TypeError, the object is not applicabl

2019-10-19 11:03发布

然而,我写了一个比较简单的银行账户功能,当我尝试运行它,我得到一个类型错误,我不知道为什么? 它是直出SICP,这样的解决方案是现成的,我只是想知道为什么我的回答产生了错误。 有什么想法吗? 这里是我的代码:

(define (make-password-account balance password)
    (define (withdraw amount)
        (if (>= balance amount)
            (begin (set! balance (- balance amount))
                balance)
            "Insufficient Funds"))
    (define (deposit amount)
        (set! balance (+ balance amount))
        balance)
    (define (dispatch users-guess-at-password m)
            (if (eq? users-guess-at-password password)
                (cond   ((eq? m 'withdraw) withdraw)
                        ((eq? m 'deposit) deposit)
                        (else (error "Unknown Request --make-account" m)))
               "INVALID PASSWORD"))
dispatch)

下面是从解释器的相关解释器的输入和输出:

..loaded function...
>(define acc (make-password-account 100 'secret))
acc
>((acc 's 'withdraw) 2)
;Stack Trace:  
0  TypeError: The object "Invalid Password" is not applicable.  
1  ((acc (quote s) (quote withdraw) 2)

Answer 1:

目前你的代码是这样做的:

((acc 's 'withdraw) 2)
((dispatch 's 'withdraw) 2)
("INVALID PASSWORD" 2)
=> TypeError: The object "INVALID PASSWORD" is not applicable.

你必须处理的情况下输入的密码是错误的。 因为如果密码不正确,你不能做任何有用的东西与该帐户,您应该发出错误信号,停止执行情况,比如替换这一行:

"INVALID PASSWORD"

有了这个:

(error "INVALID PASSWORD")

现在,程序会返回一个有意义的错误消息并停止执行。 另外,如果发出错误信号太激烈,你可以返回一个字符串,通过@molbdnilo的建议。 一旦再次更换"INVALID PASSWORD"的建议的程序,这不管它接收的参数会返回错误字符串:

(lambda (x) "INVALID PASSWORD")

现在执行将是这样的:

((acc 's 'withdraw) 2)
((dispatch 's 'withdraw) 2)
((lambda (x) "INVALID PASSWORD") 2)
=> "INVALID PASSWORD"


Answer 2:

既然你传递了错误的密码,

(acc 's 'withdraw)

那是,

(dispatch 's 'withdraw)

计算结果为

"INVALID PASSWORD"

而你试图适用于数字2,但你不能因为它不是一个功能。

你可以使用一个函数,而不是字符串,类似于其他情况:

(lambda (x) "Invalid password")


文章来源: TypeError, the object is not applicable