Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 从列表创建元组变体-Haskell_List_Haskell_Tuples - Fatal编程技术网

List 从列表创建元组变体-Haskell

List 从列表创建元组变体-Haskell,list,haskell,tuples,List,Haskell,Tuples,我是一个相对的haskell新手,正在尝试创建一个元组列表,其中包含一个名为splits的等式,该等式最初来自一个列表,如下所示: splits [1..4] --> [ ([1],[2,3,4]), ([1,2],[3,4]), ([1,2,3],[4]) ] splits xs = map (flip splitAt xs) [1..length xs - 1] 或 创建一个元组列表,其中包含1、2、3个元素,等等。我想我可能应该使用take/drop函数,但这就是我目前所拥有的,

我是一个相对的haskell新手,正在尝试创建一个元组列表,其中包含一个名为
splits
的等式,该等式最初来自一个列表,如下所示:

splits [1..4] --> [ ([1],[2,3,4]), ([1,2],[3,4]), ([1,2,3],[4]) ]
splits xs = map (flip splitAt xs) [1..length xs - 1]

创建一个元组列表,其中包含1、2、3个元素,等等。我想我可能应该使用take/drop函数,但这就是我目前所拥有的,我遇到了很多类型声明错误。。。有什么想法吗

splits :: (Num a) => [a] -> [([a], [a])]

splits [] = error "shortList"

splits [x]
       | length [x] <= 1 = error "shortList"
       | otherwise = splits' [x] 1
         where splits' [x] n = [(take n [x], drop n [x])] + splits' [x] (n+1)
splits::(Num a)=>[a]->[([a],[a])]
拆分[]=错误“短名单”
拆分[x]

|长度[x]Haskell-y方法是使用
数据中的
inits
tails
函数。列表

inits [1,2,3,4] = [ [],        [1],     [1,2], [1,2,3], [1,2,3,4] ]
tails [1,2,3,4] = [ [1,2,3,4], [2,3,4], [3,4], [4],     [] ]
然后,我们将这两个列表压缩在一起,并删除第一对:

splits xs = tail $ zip (inits xs) (tails xs)
或者等效地,首先删除每个成分列表的第一个元素:

          = zip (tail (inits xs)) (tail (tails xs))

Haskell-y方法是使用
数据中的
inits
tails
函数

inits [1,2,3,4] = [ [],        [1],     [1,2], [1,2,3], [1,2,3,4] ]
tails [1,2,3,4] = [ [1,2,3,4], [2,3,4], [3,4], [4],     [] ]
然后,我们将这两个列表压缩在一起,并删除第一对:

splits xs = tail $ zip (inits xs) (tails xs)
或者等效地,首先删除每个成分列表的第一个元素:

          = zip (tail (inits xs)) (tail (tails xs))

有一个内置函数,它可以实现您所需的部分功能:

splitAt :: Int -> [a] -> ([a], [a])
它会做它看起来会做的事情:

> splitAt 2 [1..4]
([1,2],[3,4])
使用此函数,您可以如下定义拆分:

splits [1..4] --> [ ([1],[2,3,4]), ([1,2],[3,4]), ([1,2,3],[4]) ]
splits xs = map (flip splitAt xs) [1..length xs - 1]

有一个内置函数,它可以实现您所需的部分功能:

splitAt :: Int -> [a] -> ([a], [a])
它会做它看起来会做的事情:

> splitAt 2 [1..4]
([1,2],[3,4])
使用此函数,您可以如下定义拆分:

splits [1..4] --> [ ([1],[2,3,4]), ([1,2],[3,4]), ([1,2,3],[4]) ]
splits xs = map (flip splitAt xs) [1..length xs - 1]

你有几个错误

对于
a
,不需要使用
numa

使用
[]
[x]
作为模式,而不是变量,使用
xs

使用
++
而不是
++
连接列表

在本例中,使用
(:)
将列表添加到值中,而不是
++

为递归添加停止,如将附加变量
maxn
添加到
splits'

splits :: [a] -> [([a], [a])]
splits [] = error "shortList"
splits xs
       | lxs <= 1 = error "shortList"
       | otherwise = splits' xs 1 lxs
         where
           lxs = length xs
           splits' xs n maxn 
               | n > maxn  = []
               | otherwise = (take n xs, drop n xs) : splits' xs (n+1) maxn
splits::[a]->[([a],[a])]
拆分[]=错误“短名单”
拆分X
|lxs maxn=[]
|否则=(取nxs,删除nxs):拆分的xs(n+1)maxn

您有几个错误

对于
a
,不需要使用
numa

使用
[]
[x]
作为模式,而不是变量,使用
xs

使用
++
而不是
++
连接列表

在本例中,使用
(:)
将列表添加到值中,而不是
++

为递归添加停止,如将附加变量
maxn
添加到
splits'

splits :: [a] -> [([a], [a])]
splits [] = error "shortList"
splits xs
       | lxs <= 1 = error "shortList"
       | otherwise = splits' xs 1 lxs
         where
           lxs = length xs
           splits' xs n maxn 
               | n > maxn  = []
               | otherwise = (take n xs, drop n xs) : splits' xs (n+1) maxn
splits::[a]->[([a],[a])]
拆分[]=错误“短名单”
拆分X
|lxs maxn=[]
|否则=(取nxs,删除nxs):拆分的xs(n+1)maxn

正如您所声明的,第一个参数的类型是一个列表。但是您不需要函数本身中的类型,除非您是模式匹配,而只需要参数名。换句话说,尝试将“[x]”替换为参数名“x”,我们知道它是一个列表。(“[x]”在本例中是指一个包含一个元素的列表,x)即使我尝试上述操作,我也会得到一个类型错误:“无法从splits的类型签名绑定的上下文(Num a)中推断(Num[([a],[a])”[([a],[a])]在splits.hs:4:10-39可能的修复方法:在表达式中为(Num[([a],[a]))添加一个实例声明:splits'x1“我不相信我必须以这种方式定义splits”,我也不确定如何定义。这个“无法推断”错误是因为您试图“添加”
[(取n[x],删除n[x])
splits'[x](n+1)
放在一起,这没有什么意义。在最后一行中,您使用了运算符“+”,它是为Num或某些此类类型保留的。请考虑哪种运算符可以更好地组合返回类型。哦,哇,这就是我所需要的。哈哈,它工作得非常好!非常感谢您,我想我很容易犯这样的新手错误。:)正如您所声明的,第一个参数的类型是列表。但是您不需要函数本身中的类型,除非您是模式匹配,而只需要参数名。换句话说,尝试将“[x]”替换为参数名“x”,我们知道它是一个列表。(“[x]”在本例中是指一个包含一个元素的列表,x)即使我尝试上述操作,我也会得到一个类型错误:“无法从splits的类型签名绑定的上下文(Num a)中推断(Num[([a],[a])”[([a],[a])]在splits.hs:4:10-39可能的修复方法:在表达式中为(Num[([a],[a]))添加一个实例声明:splits'x1“我不相信我必须以这种方式定义splits”,我也不确定如何定义。这个“无法推断”错误是因为您试图“添加”
[(取n[x],删除n[x])
splits'[x](n+1)
放在一起,这没有什么意义。在最后一行中,您使用了运算符“+”,它是为Num或某些此类类型保留的。想想哪种运算符可以更好地组合返回类型。噢,哇,这就是我所需要的一切?哈哈,它工作得很好!非常感谢您,我想我很容易犯这样的新手错误。:)