gpt4 book ai didi

haskell - 如何计算 Haskell 中元组的长度?

转载 作者:行者123 更新时间:2023-12-02 17:41:33 25 4
gpt4 key购买 nike

我尝试在 web 和 stackexchange 中搜索,但令人惊讶的是没有人问如何在 Haskell 中计算下面形式的元组的长度。

假设你在 Haskell 中有像 (1,2,3,4) 或 (1,3,5,6,7) 这样的元组,并且希望编写计算元组长度的长度函数。我怎样才能做到这一点?对于列表,我知道如何使用递归来做到这一点,而无需显式调用内置函数。但元组不同,我不能使用“头”-“尾”区分。

该方法是否涉及创建新的数据类型?

最佳答案

您在这方面找不到任何内容的原因是计算元组的长度没有多大意义:

  • 它是预先确定的编译时间(即您也可以对其进行硬编码)
  • 您实际上无法利用这些信息做太多事情:与例如列表,不可能在通用元组中索引特定条目。

也就是说,有可能实现您的目标,但这不应该是一个普通函数,而是一个类型级函数,又名类型族。使用singleton输入 nat:

{-# LANGUAGE TypeFamilies, DataKinds #-}
import Data.Singletons
import Data.Singletons.TypeLits

type family TupLength a :: Nat where
TupLength () = 0
TupLength (a,b) = 2
TupLength (a,b,c) = 3
TupLength (a,b,c,d) = 4
-- ...
TupLength x = 1

然后

> mapM_ print [ natVal (sing :: SNat (TupLength ()))
, natVal (sing :: SNat (TupLength (Int,String,Double)))
, natVal (sing :: SNat (TupLength Bool)) ]
0
3
1

关于haskell - 如何计算 Haskell 中元组的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44399914/

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