代码之家  ›  专栏  ›  技术社区  ›  Aron Lee

使用Haskell函数外部的where

  •  -1
  • Aron Lee  · 技术社区  · 6 年前

    哪里 在功能之外? 例如

    fun::Int->Int
    fun n = n + 1
    
    main = do
         fun x where x = 30
    

    我想将x声明为 只有

    1 回复  |  直到 6 年前
        1
  •  5
  •   chepner    6 年前

    函数的类型错误,无法用作 do Monad m => m Int 价值,而不仅仅是 Int . 作为 main (在通常使用中)必须是 IO 行动,这意味着 m 应该是 .

     fun :: Int -> IO Int
     fun n = return (n + 1)    
    

    一个 let where 不过,在这种情况下。

    main = do
      let x = 30 in fun x
    

    x 在范围内 只有 fun . 如果你写信

    main = do
      let x = 30
      fun x
    

    然后 从技术上讲 布洛克,不仅仅是 . 尽管共享相同的关键字 在一个 积木 表达。(关系是

    do
      let name = value
      foo
    

    let name = value
    in do
        foo
    

    )


    请注意 它本身就是 创建一元值;它只是各种运算符的语法糖 一元属性。快速概述:

    1. do { x <- y; foo x; } 变成 y >>= (\x -> foo x) .
    2. do { foo; bar; } foo >> bar .
    3. do { let x = y; foo; } 变成 let x = y in do foo
    4. do foo foo .

    与代码最相关的是规则4;在 . 只有在 block是desugared does Haskell开始键入检查结果。