Jas*_*sta 13 testing haskell types type-systems
对不起,如果问题非常简单,我对Haskell仍然很新.假设我有一个函数只能使用黄金比率中的两个数字(1.618),我如何定义myfun x y的类型以仅采用黄金比率数字.如果我在我的程序中调用没有黄金比例数字的myfun会出现什么情况(编译错误?)?如果没有黄金比例号码的呼叫是在运行时通过用户输入进行的,会发生什么?
Tho*_*son 18
您可能想要一个只能使用黄金比率数字构建的ADT,然后编写myfun以接受该数据类型.
我假设Integer是一个基类型,但你可以使用其他类型(例如:Double或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
Run Code Online (Sandbox Code Playgroud)
请注意,此模块导出Gold类型但不导出构造函数(即不导出G).因此,获取类型值的唯一方法Gold是buildGold执行运行时检查 - 但只执行一次 - 因此可以使用Gold的值,并假设所有使用者都没有检查,这是黄金比率.
2)使用ADT构建 myfun
myfun :: Gold -> ???
myfun g = expr
where (x, y) = getGold g
Run Code Online (Sandbox Code Playgroud)
现在,如果您尝试myfun使用非黄金数字(不是类型的值Gold)调用,那么您将收到编译时错误.
回顾要构建黄金数字buildGold必须使用函数,这会强制检查数字.
注意什么时候检查!您有一个编译时保证myfun,以及您要使用的所有其他功能Gold,始终提供黄金比率.程序输入(来自用户,网络或任何地方)仍然需要运行时检查,这就是buildGold提供的内容; 显然,永远不会有一个程序可以保证人类不会输入不受欢迎的东西.
您对问题的评论中给出的替代方案也值得考虑.如果你需要的只是一个单一的功能,那么ADT的重量会稍微大一些myfun,那么就会失败myfun :: (Integer, Integer) -> Maybe ???.
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |