【问题标题】:Haskell multiple bindings inside lambdalambda中的Haskell多个绑定
【发布时间】:2013-06-06 15:42:15
【问题描述】:

我是 Haskell 的新手。

我有这段代码(我对九十九个 Haskell 问题的其中一个练习的解决方案)

data Structure a = Single a | Multiple (a, Int) deriving (Show) 

encodeM ::(Eq a)=> [a]->[Structure a]

encodeM l = map(\x -> (let size = length x
            --h = head x
            in if size>1 then Multiple ( head x, size) else Single (head x)
            )
          ) $ group l

当我取消注释“-h = head x”时,我得到:“输入 `=' 上的解析错误”

但是

xxx l= let size = length l  
   h = head l
      in  size

工作正常,为什么当我在 lambda 中使用带有多个语句的“let”时它无法编译?

我试图用 where 替换 let

encodeM2 ::(Eq a)=> [a]->[Structure a]

encodeM2 l = map(\x->if si>1 then Multiple ( head x, si) else Single (head x)
   where si = length x)

但它也不能编译,有什么问题?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    这是正确缩进的代码:(注意 let 绑定如何垂直对齐)

    encodeM :: Eq a => [a] -> [Structure a]
    encodeM l = map (\x -> let size = length x
                               h = head x in
                           if size > 1
                              then Multiple (h, size)
                              else Single h) $
                  group l
    

    这是您可读的代码:

    encodeM :: Eq a => [a] -> [Structure a]
    encodeM = map runLength . group
      where
        runLength x =
          let size = length x
              h = head x in
          if size > 1
             then Multiple (h, size)
             else Single h
    

    这是您的惯用代码:

    encodeM :: Eq a => [a] -> [Structure a]
    encodeM = map runLength . group
      where
        runLength [x] = Single x
        runLength xs = Multiple (head xs, length xs)
    

    【讨论】:

    • 非常感谢。当你接触到新的语言时,通常你必须改变你的习惯(你现在已经从你的语言中得到了)并调整它以适应新的语法和不同的思维方式。感谢您的建议。
    【解决方案2】:

    我更喜欢对 if/then/else 使用模式匹配,所以你的代码变成:

    encodeM :: (Eq a) => [a] -> [Structure a]
    encodeM lst = map fun $ group lst
                  where
                    fun [x] = Single x
                    fun l = Multiple (head l, length l)
    

    【讨论】:

      【解决方案3】:

      在 Haskell whitespace matters.

      对齐let 中的分配。而且你不能在 lambda 中使用where

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 2017-05-26
        相关资源
        最近更新 更多