1

Haskell コードの網羅的ではない部分を特定するのを手伝ってくれる人がいるかどうか疑問に思っていましたか? リストの最後で基本ケースが満たされていないことがわかりません。

どうもありがとう

ジョニー

type Rule
  = (Char, String)

type Rules
  = [Rule]

type System
  = (Float, String, Rules)

cross, triangle, arrowHead, peanoGosper,
  dragon, snowflake, tree, bush :: System

type Vertex
  = (Float, Float)

type TurtleState
  = (Vertex, Float)

type Stack
  = [TurtleState]

type ColouredLine
  = (Vertex, Vertex, Colour)


trace :: String -> Float -> Colour -> [ColouredLine]

trace rules angle colour = traceState rules ((0,0),90) []

  where

    traceState :: String -> TurtleState -> Stack -> [ColouredLine]
    traceState [] _ _ = []
    traceState (x:xs) t (y:ys)
      |x == '[' = traceState xs t (t : (y:ys))
      |x == ']' = traceState xs t ys
      |x == 'F' = biggieSmalls : traceState xs t (nextY:ys)
      |otherwise = traceState xs angledY (angledY:ys)
        where
          biggieSmalls = (fst(t),fst(nextY),colour)
          nextY = move 'F' t angle
          angledY = move x t angle
4

1 に答える 1

1

Benjamin Hodgson が指摘したように、rules文字列が空ではない場合 ((_ : _)とは対照的に[]) は一致していませんが、Stackは空です。最初のスタックが実際にtrace渡されるため、そのケースはすぐに発生します。traceState[]

警告/例外を修正するには、 as の 2 番目の方程式を書き直すか、3 番目の方程式 を記述する必要がtraceStateありtraceState (x : xs) t yますtracestate (x : xs) t []。前者のソリューションでは、 を使用case y ofしてパターン マッチを行うことができますy。いずれにせよ、リストが空である状況を処理する方法を決定する必要があります。

この問題は実際には のような呼び出しで発生しますtraceState "]" t []。つまり、最初のパラメータがtrace"]" または "F" で始まる場合です。それは無効な入力のようです。その場合は、おそらく書き直しtracetraceStateを返すMaybe [ColouredLine]か、 を使用Eitherしてエラー メッセージを表示する必要があります。

于 2014-10-30T20:41:48.180 に答える