Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将变量引入范围,以及如何匹配类型_Haskell_Ghc_Ghci - Fatal编程技术网

Haskell 如何将变量引入范围,以及如何匹配类型

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的模块时,我都会遇到一个错误,我不知道如何修复它

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 (-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的列表,因此tath
x
应该是
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