Haskell-类型/模式匹配
以下代码不编译。我得到一个类型错误。我认为这将是更好的版本,因为它清楚地区分了两种不同的情况。。。 该函数应该帮助确定有限状态机是否接受输入字Haskell-类型/模式匹配,haskell,types,pattern-matching,Haskell,Types,Pattern Matching,以下代码不编译。我得到一个类型错误。我认为这将是更好的版本,因为它清楚地区分了两种不同的情况。。。 该函数应该帮助确定有限状态机是否接受输入字 import Text.Show.Functions import qualified Data.Set as Set import qualified Data.List as List setTransition :: (Int -> Char -> [Int]) -> [Int] -> Char -> [Int]
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
谢谢你的帮助,你刚才有一个语法错误:
xs@[x:xs']
应该是
xs@(x:xs')
但实际上你不需要两个箱子,因为
foldl f b [] = b
所以
正如您的空列表案例所需
事实上,在
[]
上进行模式匹配而不在(x:xs)
上进行模式匹配,并使用x
和xs
——这就是我知道如何思考foldl
是否会在这两种情况下为您提供正确答案的原因。不过,这种情况偶尔也会发生。您刚才遇到了一个语法错误:
xs@[x:xs']
应该是
xs@(x:xs')
但实际上你不需要两个箱子,因为
foldl f b [] = b
所以
正如您的空列表案例所需
事实上,在
[]
上进行模式匹配而不在(x:xs)
上进行模式匹配,并使用x
和xs
——这就是我知道如何思考foldl
是否会在这两种情况下为您提供正确答案的原因。不过,它确实偶尔发生。xs@(x:xs')
,而不是xs@[x:xs']
。。谢谢^这解决了问题…xs@(x:xs')
,而不是xs@[x:xs']
。。谢谢^^这解决了问题。。。