类型签名只允许在带有 ScopedTypeVariables 的模式中使用 - 使用不带花括号的地方

Type signatures are only allowed in patterns with ScopedTypeVariables - using where without curly braces

我面临以下问题。 当我尝试编译函数时

myFunction :: Int -> Int -> Int
myFunction x y = myVar1
     where {myVar1 :: Int;
            myVar1 = 1}

一切正常。但是,当我不使用花括号并尝试正确缩进时

myFunction :: Int -> Int -> Int
myFunction x y = myVar1
     where myVar1 :: Int
           myVar1 = 1

我收到错误

Illegal type signature: `Int myVar1'
      Type signatures are only allowed in patterns with ScopedTypeVariables

谁能告诉我这是为什么?

提前致谢

你混合了制表符和空格,确实,如果我们使用 Unicode 的控制图片,我们会看到:

myFunction :: Int -> Int -> Int
myFunction␣x␣y␣=␣myVar1
␣␣␣␣␣where␣myVar1␣::␣Int
␉␣␣␣␣␣␣␣myVar1␣=␣1

注意左侧的水平制表符 ()。混用制表符和空格通常会导致编译器错误,因为在这种特定情况下,Haskell 编译器将其视为类型 myVar1 :: Int myVar1,因此会出现错误。

因此您应该只使用空格,例如:

myFunction :: Int -> Int -> Int
myFunction x y = myVar1
      where myVar1 :: Int
            myVar1 = 1

如果我们使用控制图片,我们只会看到空格,并且列与 myVar1 :: Int 部分的列匹配。

myFunction :: Int -> Int -> Int
myFunction␣x␣y␣=␣myVar1
␣␣␣␣␣where␣myVar1␣::␣Int
␣␣␣␣␣␣␣␣␣␣␣myVar1␣=␣1