0

次のコードはコンパイルされません。タイプエラーが発生します。これは、2つの異なるケースを明確に分離しているため、より良いバージョンになると思いました...この関数は、有限状態マシンが入力ワードを受け入れるかどうかを判断するのに役立つはずです。

import Text.Show.Functions
import qualified Data.Set as Set
import qualified Data.List as List

setTransition :: (Int -> Char -> [Int])  -> [Int] -> Char -> [Int]
setTransition delta [] sigma            = []
setTransition delta xs@[x:xs'] sigma    = foldl f [] xs
                where f ys q = (delta q sigma) `List.union` ys

ただし、これ(パターンマッチングを削除)はコンパイルされます。誰かが理由を教えてもらえますか?

import Text.Show.Functions
import qualified Data.Set as Set
import qualified Data.List as List

setTransition :: (Int -> Char -> [Int])  -> [Int] -> Char -> [Int]
setTransition delta [] sigma            = []
setTransition delta xs sigma    = foldl f [] xs
                where f ys q = (delta q sigma) `List.union` ys

助けてくれたThx

4

1 に答える 1

6

構文エラーが発生しました:

xs@[x:xs']

する必要があります

xs@(x:xs')

ただし、実際には2つのケースは必要ありません。

foldl f b [] = b

それで

foldl f [] [] = []

空のリストの場合と同じように。

実際、パターンマッチングをオンにして使用せ[]ずにパターンマッチをオンにすることは非常にまれです。そのため、どちらの場合も正しい答えが得られるかどうかを考えることができました。しかし、それは時々起こります。(x:xs)xxsfoldl

于 2013-02-21T18:21:29.467 に答える