首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析输入“Just”上的错误

解析输入“Just”上的错误
EN

Stack Overflow用户
提问于 2016-04-15 03:16:59
回答 2查看 383关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
myF :: Maybe Int -> Maybe Int -> (Int, Int)
myF mb1 mb2 =
  let var1 = case mb1 of
    Just x -> x
    Nothing -> 123

  let var2 = case mb2 of
    Just x -> x
    Nothing -> 456

  let var3 = (var1 + var2 ) * 333
  (var2, var3)

它给了我一个编译错误“解析输入‘正义’的错误”。怎么修呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-15 04:00:58

正如Daniel已经说过的,let绑定的内容需要比其模式更缩进。此外,您还需要在let … in块之外的do。如果你真的想使用三个let,你最终会得到这样的结果:

代码语言:javascript
复制
myF :: Maybe Int -> Maybe Int -> (Int, Int)
myF mb1 mb2 =
  let var1 = case mb1 of
       Just x  -> x
       Nothing -> 123
  in let var2 = case mb1 of
          Just x  -> x
          Nothing -> 456
     in let var3 = (var1 + var2 ) * 333
        in (var2, var3)

但是,多个let … in通常可以重构为单个let … in。请注意,即使是带有单个let … in的版本也违反了不要重复自己的规则:

代码语言:javascript
复制
myF :: Maybe Int -> Maybe Int -> (Int, Int)
myF mb1 mb2 =
  let var1 = case mb1 of  -- (1)
       Just x  -> x
       Nothing -> 123
      var2 = case mb1 of  -- (2)
       Just x  -> x
       Nothing -> 456
      var3 = (var1 + var2 ) * 333
  in (var2, var3)

(1)(2)中使用(几乎)相同的代码两次。另外,您可能忽略了(2)中引入的错误,在那里我使用了mb1而不是mb2。您可以使用fromMaybe (在Data.Maybe中)使它更加可读性:

代码语言:javascript
复制
import Data.Maybe (fromMaybe)
-- fromMaybe :: a -> Maybe a -> a

myF :: Maybe Int -> Maybe Int -> (Int, Int)
myF mb1 mb2 =
  let var1 = fromMaybe 123 mb1
      var2 = fromMaybe 456 mb2
      var3 = (var1 + var2) * 333
  in (var2, var3)

练习

  • 不看它的源代码,试着自己实现fromMaybe
  • 重写myF,这次使用where而不是let … in (只是为了更加熟悉Haskell的语法)。
票数 3
EN

Stack Overflow用户

发布于 2016-04-15 03:41:35

有两个问题:

  1. letof都引入了块。要正确解析,case/of块中的模式必须缩进多于let块中的模式。
  2. 因为您不在do块中,所以每个let都必须附带一个in。您只需使用一个in块就可以减少所需的let总数。

加起来,这会让你:

代码语言:javascript
复制
myF :: Maybe Int -> Maybe Int -> (Int, Int)
myF mb1 mb2 =
  let var1 = case mb1 of
        Just x -> x
        Nothing -> 123

      var2 = case mb2 of
        Just x -> x
        Nothing -> 456

      var3 = (var1 + var2 ) * 333
  in (var2, var3)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36637677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档