List 从列表创建元组变体-Haskell
我是一个相对的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函数,但这就是我目前所拥有的,
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或某些此类类型保留的。想想哪种运算符可以更好地组合返回类型。噢,哇,这就是我所需要的一切?哈哈,它工作得很好!非常感谢您,我想我很容易犯这样的新手错误。:)