繁体   English   中英

将列表转换为嵌套元组 Haskell

[英]Convert list to nested tuple Haskell

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

根据评论进行编辑

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

A -> n A

所以我可以得到一个像'nnnn 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM