您可能希望有一个ADT,该数字只能用金字数构造,然后书写我方接受这一数据类型。
我将Integer视为一个基类,但你可以使用其他类型(如:双向或Float)或甚至多变。
(1) 使ADT成为可能
module Golden (Gold, getGold, buildGold) where
data Gold = G Integer Integer
getGold :: Gold -> (Integer, Integer)
getGold (G x y) = (x, y)
buildGold :: Integer -> Integer -> Maybe Gold
buildGold x y
| isGolden x y = Just (G x y)
| otherwise = Nothing
该模块出口<代码>Gold,但不是构件(即<代码>G)。 因此,获得<代码>Gold值的唯一途径是buildGold
,该编码进行操作时间检查,但只有一次,因此,所有消费者均可使用和假设黄金价值为黄金比率而无需检查。
2) 利用ADT建造myfun
myfun :: Gold -> ???
myfun g = expr
where (x, y) = getGold g
现在,如果你试图用非刚果籍号码(不使用<代码>Gold的数值)打上“密码>,那么你就会发现一个汇编时的错误。
Recap
To build golden numbers buildGold
function must be used, which forces the number to be checked.
通知:什么时候被检查! 您有一份汇编的时间保证,即<代码>myfun,以及你希望使用<代码>Gold的所有其他功能,总是提供黄金比率。 方案投入(来自用户、网络或从未有过的)仍需要经过时间检查,而<代码>buildGold提供;显然,从来不会有一个方案,让人类赢得某种不受欢迎的东西。
你们对问题的评论中提出的备选办法也值得考虑。 如果大家需要一个单一功能,myfun
,那么,哪怕是myfun • (Integer, Integer)-> Maybe ?
。