haskell - 带防护功能 : syntax error when using "where"

标签 haskell syntax

MWE:

import Control.Monad.State.Lazy

fibStep :: State (Integer, Integer) ()
fibStep = state $ \(a, b) -> ((), (b, a + b))

execStateN :: Int -> State s a -> s -> s
execStateN n m s
  | n == 1 = execState m s
  | n > 1 = let s' = execState m s in
              execStateN (n - 1) m s'
  -- | n > 1 = execStateN (n - 1) m s' where s' = execState m s
  | otherwise = error "undefined behaviour"

它可以工作,但是一旦我取消注释 where 变量并注释 let 变量,就会出现语法错误:

error: parse error on input ‘|’

我检查了缩进,它们很好。怎么了?

最佳答案

where 的范围涵盖所有守卫,因此您将其放在守卫的末尾,例如:

execStateN :: Int -> State s a -> s -> s
execStateN n m s
  | n == 1 = execState m s
  | n > 1 = execStateN (n - 1) m s'
  | otherwise = error "undefined behaviour"
  <b>where</b> s' = execState m s

关于haskell - 带防护功能 : syntax error when using "where",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58583869/

相关文章:

syntax - 将 F# 管道符号与对象构造函数一起使用

haskell - Haskell中的函数应用函数

Haskell 解析器、Monad 和 MonadPlus

Haskell:如何获取具有多个参数的数据类型的类型(如 `Path a b = ..`

haskell 递归 : interleave function in Programming in Haskell ch. 11

ruby - end.method 在 Ruby 中有什么作用?

haskell - 为什么 Haskell 中的 seq 必须对底部有特殊的规则?

c# - C# 关键字什么时候不保留?

python - 为什么python同时使用 ""和 ' '来制作字符串文字

javascript - 函数变量和函数内变量具有相同的名称。如何访问?