gpt4 book ai didi

haskell - 如何在 Haskell 中对数据强制执行运行时条件?

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

我想定义一个函数f [Int] -> Int,其中f等于列表中元素的总和,如果列表的长度为一个完美的正方形,否则未定义。在 Haskell 中执行此操作的惯用方法是什么?

在命令式语言中,我会添加一行来实现 assert sqrt(len(xs)) is integer 的效果,以便为未定义的情况生成异常。在像 Haskell 这样的强类型函数语言中,您希望将未定义的条件构建到类型系统中,但是这里不能这样做,因为没有“长度完全平方列表”类型。

我宁愿让程序在未定义的情况下因错误而停止,而不是让函数返回 Nothing

最佳答案

如果您想正式一点,这可能是使用 smart constructor 的好机会。 .

module PSqList
( PSqList -- constructor *not* exported
, fromList
)
where

newtype PSqList a = PSqList [a]
deriving (Functor, Foldable)

fromList :: [a] -> Maybe (PSqList a)
fromList xs
| isPerfectSquare (length xs) = Just (PSqList xs)
| otherwise = Nothing

那么当您使用PSqList模块时,您只能构造一个具有完美平方长度的PSqList

使用整个模块来做这样的事情感觉有点奇怪;也许您想要一个更通用的不变跟踪系统。一般来说,这是像 Agda 这样的依赖类型语言的领域,但 Haskell 中有一个可爱的中点可用,如功能性珍珠 Ghosts of Departed Proofs 所示。 .

关于haskell - 如何在 Haskell 中对数据强制执行运行时条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53715440/

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