din*_*337 3 haskell types tuples list
简短而甜美的问题是,我正在解析一个数字列表([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
Run Code Online (Sandbox Code Playgroud)
*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
Run Code Online (Sandbox Code Playgroud)