如何将变量引入作用域,以及如何匹配类型

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