【问题标题】:Haskell group definition with span function具有 span 函数的 Haskell 组定义
【发布时间】:2018-11-15 10:45:02
【问题描述】:

我需要定义组函数是Haskell,但我只能用takeWhile和dropWhile来做,但我不能用span来做。 我需要用跨度来做! 你可以帮帮我吗? 这是我的 tW 和 dW 代码:

group' :: (Eq a) => [a] -> [[a]]
group' [] = []
group' (x:xs) = (x : takeWhile (== x) xs) : group' (dropWhile (== x) xs)

【问题讨论】:

  • 不能做什么是什么意思?是不是报错了?

标签: function haskell definition


【解决方案1】:

试试这个。

 group' (x:xs) = a:(group' b) where (a,b) = span (==x) (x:xs)

Span 只返回两个列表,它们使用给定的函数分隔。

【讨论】:

  • 感谢您的帮助!我需要这样的答案!
【解决方案2】:

查看hackagespan的定义,我们发现这个有用的提示:

span p xs 等价于 (takeWhile p xs, dropWhile p xs)

所以,正如您将函数定义为

group' [] = []
group' (x:xs) = (x : takeWhile (==  x) xs) : group' (dropWhile (== x) xs) 

您可以很容易地看到在这种情况下您的p(== x)。所以,在上面的 span 定义中替换它

span p xs = (takeWhile p xs, dropWhile p xs)
span (== x) xs = (takeWhile (== x) xs, dropWhile (== x) xs)

span 返回一对列表,因此您可以使用fstsnd 访问它们。 所以我们有这个

takeWhile (== x) xs = fst (span (== x) xs) 

dropWhile (== x) xs = snd (span (== x) xs) 

使用它,我们可以像这样在您的原始函数中替换它们:

group' [] = []    
group' (x:xs) = (x : fst (span (== x) xs) ) : group' (snd (span (== x) xs) ) 

当然,用相同的参数调用同一个函数两次(span (== x) xs)并不好,所以让我们用let绑定调用它一次:

group' [] = []
group' (x:xs) = let s = span (== x) xs in (x : (fst s)) : group' (snd s)

我喜欢 Haskell 最终只是数学的方式,您可以仅使用一些代数方程将某些定义(例如您用于 takeWhile 和 dropWhile 的定义)替换为其他定义(跨度)!

【讨论】:

  • 当然,我的最终表达式可以通过避免使用 @manoj-r 那样使用 fstsnd 来进一步简化,但我更感兴趣的是向您展示我在脑海中遵循的步骤到达那里。
  • 感谢您的帮助,展示完整的方法非常有用!
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多