gpt4 book ai didi

haskell - 为具有静态类型长度的列表编写长度函数

转载 作者:行者123 更新时间:2023-12-04 17:37:36 25 4
gpt4 key购买 nike

给定一个静态类型长度的列表(以 this 为例):

data Zero

data Succ nat

data List el len where
Nil :: List el Zero
Cons :: el -> List el len -> List el (Succ len)

是否可以编写一个长度函数来使用静态类型而不是通常的递归来计算长度?

到目前为止,我的努力使我得出结论,这是不可能的,因为它需要“解除”类型信息才能重复出现:
class HasLength a where
length :: a -> Natural

instance HasLength (List el Zero) where
length _ = 0

instance HasLength (List el (Succ len)) where
length _ = 1 + *how to recur on type of len*

但是,我才刚刚开始了解类型可能带来的所有魔法,所以我知道我无法构思解决方案并不意味着没有解决方案。

更新

由于长度返回自然,我错误地写了 length _ = 1 + ... .正确的实例(使用下面给出的答案)是
instance HasLength (List el len) => HasLength (List el (Succ len)) where
length _ = succ $ length (undefined :: List el len)

最佳答案

例如像这样:

instance HasLength (List el len) => HasLength (List el (Succ len)) where
length _ = 1 + length (undefined :: List el len)

注意:这需要 ScopedTypeVariables延期。

关于haskell - 为具有静态类型长度的列表编写长度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13555982/

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