我正在学习 Haskell,通过讲座:http://www.cis.upenn.edu/~cis194/spring13/ http://www.cis.upenn.edu/~cis194/spring13/
我有:
module HanoiDisk(HanoiDisk, hanoiDisk) where
import Control.Exception
data HanoiDisk = HanoiDisk' Integer deriving (Show)
hanoiDisk :: Integer -> HanoiDisk
hanoiDisk n = assert (n >= 1) $ HanoiDisk' n
这可行,但如果我有:
main = do
print(show (hanoiDisk (-3))
我只在运行时而不是在编译时收到错误。
我非常想了解如何完全消除运行时异常。
任何人都可以提供替代方法吗?
Thanks
哈斯克尔检查types编译代码时,而不是值。让类型依赖于值是“依赖类型”的工作。这是一个高级主题。
实现这一目标的另一种方法是使您的hanoiDisk
work not with Integer
s,但有一些“PositiveInteger
" 类型不可能为负数(或者也为 0..?)。这是一种更基本的方法。
没有什么可以断言的——你甚至不可能用这种类型写下负值。你必须让这个类型成为一个实例Num
, Eq
, Ord
, and Show
(maybe Enum
以及)。
通常的方法是定义
data Nat = Z | S Nat
deriving (Eq, Show)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)