Haskell,递归数据和模式匹配

时间:2015-04-02 09:13:38

标签: haskell


这是我第一次使用递归data。 我无法解决这个问题:

data Sseq = S Sseq | E deriving (Show)

testElem = (S, S, E, S)

maxSseq_hlp :: Int -> Int -> [SSeq] -> Int
maxSseq_hlp curmax prevmax [] = max curmax prevmax
maxSseq_hlp curmax prevmax ((S x):xs) = maxSSeq_hlp (curmax+1) prevmax xs
maxSseq_hlp curmax prevmax (E:xs) = maxSSeq_hlp 0 (max curmax prevmax) xs

maxSseq :: [SSeq] -> Int
maxSseq list = maxSseq_hlp 0 0 list

函数maxSseq应该返回列表testElem中最长的序列S,使用一个辅助函数来记住前面序列中计数的S,但是给出了以下错误

Couldn't match expected type `[Sseq]'
            with actual type `(Sseq -> Sseq,
                               Sseq -> Sseq,
                               Sseq,
                               Sseq -> Sseq)'
In the first argument of `maxSseq', namely `testElem'
In the expression: maxSseq testElem
In an equation for `it': it = maxSseq testElem

我不明白问题在哪里,你能帮帮我吗?

1 个答案:

答案 0 :(得分:4)

一个接一个地说好了:

元组vs列表

您的testElem实际上不是一个列表 - 它是一个元组 - 因此您必须编写[..]而不是(..)

构造

您的Sseq可以是ES s,其中s本身必须再次为Sseq - 因此您的testElem不会以这种方式工作(这就是为什么你得到错误,说你使用了函数Sseq -> Sseq(那些是S

我建议:

testElem :: [Sseq]
testElem = [S E, S (S (S E)), E, S (S E)]

根据您3的所需行为(见下文),这应评估(IMO)S (S (S E))maxSseq

使用此功能再试一次(我猜这是某种类型的家庭作业)

PS

您将看到的所有其他错误基本上都来自拼写错误 - 最像是SSeq VS Sseq;)

更多提示:

  • 您的功能不起作用(您在计算时消耗S中的最多一个)
  • 您可以尝试通过巧妙地重新插入x
  • 中的(S x)::xs来解决此问题
  • 但我认为你真正想做的是先实现一个函数len :: Sseq -> Int,然后以某种方式巧妙地使用它
  • 根据您的描述,您真正想要的是maxSseq :: [Sseq] -> Sseq - 所以如果您坚持使用您的代码,您必须记住最大值。 seqence不是(仅)它的长度
  • 如果您感兴趣,可以使用我以前的提示使用comparingmaximumBy
  • 轻松解决此问题

我会在一个小时左右的时间内附上我的完整解决方案,但你应该先自己尝试一下。

解决方案(如果您还在尝试,请不要阅读)

好的,你可以修补你的解决方案:

maxSseq_hlp :: Int -> Int -> [Sseq] -> Int
maxSseq_hlp curmax prevmax [] = max curmax prevmax
maxSseq_hlp curmax prevmax ((S x):xs) = maxSseq_hlp (curmax+1) prevmax (x:xs)
maxSseq_hlp curmax prevmax (E:xs) = maxSseq_hlp 0 (max curmax prevmax) xs

如果您需要找到 max,我建议这就是。长度元素

import Data.List (maximumBy)
import Data.Ord (comparing)

len :: Sseq -> Int
len E = 0
len (S x) = 1 + len x

maxSseq :: [Sseq] -> Sseq
maxSseq = maximumBy (comparing len)