如何将变量引入作用域,以及如何匹配类型
How do I bring a variable into scope, and how to match types
每次我尝试加载包含 func1 的模块时,我都会遇到错误,而且我不知道如何修复它。
func2 和 func3 独立工作,做他们应该做的事情。
func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
func1 需要一个字符串并且应该传递另一个字符串。 xs 是输入字符串,x 是输出字符串。 func 2 期望 Int 和 String,c 是 Int,并生成另一个 String。 func3 需要一个字符串,并输出一个元组。 (_,c) 是输出,第一个元素是 _ 因为它与这个函数无关,第二个元素是一个整数。
没有输出,我收到以下错误消息:
Programm.hs:205:18: error:
Variable not in scope: c :: Integer
|
205 | func2 (-c) xs
| ^
Programm.hs:208:16: error:
* Couldn't match type `[Char]' with `Char'
Expected type: Char
Actual type: String
* In the expression: x
In the expression:
[x | let x = func2 (- c) xs, (_, c) <- func3 xs]
In an equation for `decypher':
func1 xs = [x | let x = func2 (- c) xs, (_, c) <- func3 xs]
|
208 | func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
|
Programm.hs:208:36: error:
Variable not in scope: c :: Int
|
208 | func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
|
Failed, no modules loaded.
现在,我的问题是:当我将 c 定义为 func3 输出的第二个元素(我也用 "let (_,c) = func3 xs" 尝试过)时,为什么它说 c 不是整数,这必然是一个整数?
当 func2 的输出必须是字符串时,为什么期望 x 是字符?
先谢谢大家了,还请耐心等待,我刚学Haskell:*
您应该将 let
子句和生成器子句的顺序调换为:
func1 xs = [ x | (_,<b>c</b>) <- func3 xs, let x = func2 (-<b>c</b>) xs ]
但是由于您在这里只在列表理解的 "yield" 部分使用 x
,您可以简单地省略 let x = …
,并使用:
func1 xs = [ <b>func2 (-c) xs</b> | (_,c) <- func3 xs ]
基于:
func1 :: String -> String
func2 :: Int -> String -> String
func3 :: String -> (Float,Int)
您的 func3
不是 return 列表:它 return 是一个二元组。在这种情况下,您的 func1
可能看起来像:
func1 :: String -> String
func1 = negate . snd . func3 >>= func2
或更简单:
func1 :: String -> String
func1 xs = func2 (- (snd (func3 xs))) xs
每次我尝试加载包含 func1 的模块时,我都会遇到错误,而且我不知道如何修复它。
func2 和 func3 独立工作,做他们应该做的事情。
func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
func1 需要一个字符串并且应该传递另一个字符串。 xs 是输入字符串,x 是输出字符串。 func 2 期望 Int 和 String,c 是 Int,并生成另一个 String。 func3 需要一个字符串,并输出一个元组。 (_,c) 是输出,第一个元素是 _ 因为它与这个函数无关,第二个元素是一个整数。
没有输出,我收到以下错误消息:
Programm.hs:205:18: error:
Variable not in scope: c :: Integer
|
205 | func2 (-c) xs
| ^
Programm.hs:208:16: error:
* Couldn't match type `[Char]' with `Char'
Expected type: Char
Actual type: String
* In the expression: x
In the expression:
[x | let x = func2 (- c) xs, (_, c) <- func3 xs]
In an equation for `decypher':
func1 xs = [x | let x = func2 (- c) xs, (_, c) <- func3 xs]
|
208 | func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
|
Programm.hs:208:36: error:
Variable not in scope: c :: Int
|
208 | func1 xs = [x| let x = func2 (-c) xs, (_,c) <- func3 xs]
|
Failed, no modules loaded.
现在,我的问题是:当我将 c 定义为 func3 输出的第二个元素(我也用 "let (_,c) = func3 xs" 尝试过)时,为什么它说 c 不是整数,这必然是一个整数?
当 func2 的输出必须是字符串时,为什么期望 x 是字符?
先谢谢大家了,还请耐心等待,我刚学Haskell:*
您应该将 let
子句和生成器子句的顺序调换为:
func1 xs = [ x | (_,<b>c</b>) <- func3 xs, let x = func2 (-<b>c</b>) xs ]
但是由于您在这里只在列表理解的 "yield" 部分使用 x
,您可以简单地省略 let x = …
,并使用:
func1 xs = [ <b>func2 (-c) xs</b> | (_,c) <- func3 xs ]
基于
func1 :: String -> String
func2 :: Int -> String -> String
func3 :: String -> (Float,Int)
您的 func3
不是 return 列表:它 return 是一个二元组。在这种情况下,您的 func1
可能看起来像:
func1 :: String -> String
func1 = negate . snd . func3 >>= func2
或更简单:
func1 :: String -> String
func1 xs = func2 (- (snd (func3 xs))) xs