gpt4 book ai didi

Haskell 智能构造函数的编译时检查

转载 作者:行者123 更新时间:2023-12-02 20:16:24 26 4
gpt4 key购买 nike

我正在学习 Haskell,正在浏览讲座: 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))

我只在运行时而不是编译时收到错误。

我非常想了解如何完全消除运行时异常。

谁能提供替代方法吗?

谢谢

最佳答案

Haskell 在编译代码时检查类型,而不是值。让类型依赖于值是“依赖类型”的工作。这是一个高级主题。

实现此目的的另一种方法是让您的 hanoiDisk 工作 Integer,而是使用一些“PositiveInteger"类型不可能为负数(或者 0 也是......?)。这是一种更基本的方法。

没有什么可以断言的——你甚至不可能用这种类型写下负值。您必须将此类型设为 NumEqOrdShow 的实例(可能 枚举)。

通常的方法是定义

data Nat = Z | S Nat 
deriving (Eq, Show)

关于Haskell 智能构造函数的编译时检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52298627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com