簡體   English   中英

Haskell,遞歸數據和模式匹配

[英]Haskell, recursive data and pattern matching


這是我第一次使用遞歸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

我不明白問題出在哪里,請您能幫我嗎?

一次又一次地確定:

元組與列表

您的testElem實際上不是一個列表-它是一個元組-因此您必須寫[..]而不是(..)

建設者

您的Sseq可以是ES s ,其中s本身必須再次是Sseq因此您的testElem將無法以這種方式工作(這就是為什么您收到錯誤消息,指出您使用了函數Sseq -> Sseq (這些是S

我會建議:

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

這應該根據您期望的maxSseq行為將(IMO)評估為3S (S (SE)) (請參閱下文)

使用它,然后重試(我想這是某種形式的家庭作業)

PS

您將看到的所有其他錯誤基本上都來自拼寫錯誤的內容-最有可能是SSeq VS Sseq ;)

更多提示:

  • 您的函數將不起作用(計數時最多消耗S之一)
  • 您可以嘗試通過從(S x)::xs重新插入x來解決此問題
  • 但是我認為您真正想做的是先實現len :: Sseq -> Int函數,然后以某種方式巧妙地使用它
  • 根據您的描述,您真正想要的是maxSseq :: [Sseq] -> Sseq因此,如果您堅持使用自己的代碼,則必須記住最大值。 序列不是(僅)它的長度
  • 如果你有興趣,你可以用我的前提示這一點很容易使用,以解決比較maximumBy

我會在一個小時左右的時間內附加完整的解決方案,但您應該首先自己嘗試一下。

解決方案(如果您仍在嘗試,請不要閱讀)

好的,這是修補解決方案的方法:

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

這就是我建議您是否需要找到的最大值。 長度元素

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM