Haskell 如何将变量引入范围,以及如何匹配类型
每次我尝试加载包含func1的模块时,我都会遇到一个错误,我不知道如何修复它 func2和func3独立工作,并且完全按照他们应该做的去做Haskell 如何将变量引入范围,以及如何匹配类型,haskell,ghc,ghci,Haskell,Ghc,Ghci,每次我尝试加载包含func1的模块时,我都会遇到一个错误,我不知道如何修复它 func2和func3独立工作,并且完全按照他们应该做的去做 func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs] func1 xs=[x | let x=func2(-c)xs,(|,c)您应该将let子句和generator子句的顺序交换为: func1 xs = [ x | (_,c) <- func3 xs, let x = func2
func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
func1 xs=[x | let x=func2(-c)xs,(|,c)您应该将let
子句和generator子句的顺序交换为:
func1 xs = [ x | (_,c) <- func3 xs, let x = func2 (-c) xs ]
根据:
您的func3
不返回列表:它返回一个2元组。在这种情况下,您的func1
可能如下所示:
func1 :: String -> String
func1 = negate . snd . func3 >>= func2
或更简单:
func1 :: String -> String
func1 xs = func2 (- (snd (func3 xs))) xs
您可以颠倒let
语句和生成器的顺序。func1 xs=[x |(|,c)否,func1 xs=[x |(|,c)通过签名表示它们的类型?它们是func1::String->String
,func2::Int->String->String
和func3::String->(Float,Int)
。我应该在一个新问题中包含哪些其他信息?如果func3
的结果是(Float,Int)
,那么这不是一个列表,因此您不能编写(\uu,c)func1::String->String func1 xs=func2(-(snd(func3 xs)))xs
有效,谢谢。但是,如果你不介意解释的话,我不明白为什么它首先希望x是一个字符,或者为什么c不在范围内,我是否总是必须在使用它之前定义一个变量,我认为Haskell“向后”工作,因为它基本上建立了所有预期输入的积压,然后从那里开始工作,正如我所理解的那样。@Saturanal:因为你函数的签名是String->String
,所以你的列表理解会产生一个Char
s的列表,因此tathx
应该是Char
。哦,当然上帝啊,我是个哑巴。但是为什么它不承认c的定义呢?因为你的列表理解有点像let x=func2(-c)xs in(u,c)>=return x
,因此你在let
语句的头部使用c
,但它只出现在主体中。
func1 :: String -> String
func2 :: Int -> String -> String
func3 :: String -> (Float,Int)
func1 :: String -> String
func1 = negate . snd . func3 >>= func2
func1 :: String -> String
func1 xs = func2 (- (snd (func3 xs))) xs