gpt4 book ai didi

list - 将列表转换为嵌套元组 Haskell

转载 作者:行者123 更新时间:2023-12-01 06:31:33 25 4
gpt4 key购买 nike

简短而贴心,我的问题是我正在解析一个数字列表 ([Integer]),我想将该列表转换为嵌套元组,例如列表 [1,2,3,4] 将是 (1,(2,(3,4))) 在我看来这可以通过折叠操作来实现。我认为我遇到的问题是类型不是事先确定的,这使得元组嵌套可能是无限的。

根据评论进行编辑

感谢您的良好回复,根本问题是作业,所以这就是为什么大问题的细节很少,但为了不让你想知道我可以扩展一点,虽然我不是在寻找扩展的答案。我的问题归结为上下文无关语法的正确递归和正确关联部分的问题,我有类似

A -> n A

所以我可以得到像这样的表达式 'n n n n A',它解析为 'n(n(n(n A)))'(A 确实有其他终端)。我可以将它解析为“[n,n,n,n] A”,这就是我想要转换的原因(我知道有更好的方法,我只是在努力寻找它)。

最佳答案

正如 Thomas M. DuBuisson 评论的那样,这并不是真正可行的好方法,因为列表长度仅在运行时已知,但不同深度的元组具有不同的类型,并且类型必须在编译时已知。

(从技术上讲,Haskell 实际上能够通过使用 Data.Dynamic 类型充当完全动态类型的语言,但这确实不切实际。)

然而,还有另一种方法可以进行合理的列表到元组转换:如果您确实在编译时知道正确的深度是多少,并且不匹配长度的列表应该简单是一个无效的输入。在这种情况下,您可以使用类似

{-# LANGUAGE FunctionalDependencies, FlexibleInstances #-}

class NestedTup e t where
toNestedTup :: [e] -> Maybe t

instance NestedTup e e where
toNestedTup [e] = Just e
toNestedTup _ = Nothing
instance NestedTup h t => NestedTup h (h,t) where
toNestedTup (h:t) = (h,)<$>toNestedTup t
toNestedTup [] = Nothing
*Main> toNestedTup [1,2,3,4 :: Int] :: Maybe (Int,(Int,(Int,Int)))
Just (1,(2,(3,4)))
*Main> toNestedTup [1,2,3,4,5 :: Int] :: Maybe (Int,(Int,(Int,Int)))
Nothing

关于list - 将列表转换为嵌套元组 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675608/

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