我有这样的代码:
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)它给了我一个编译错误“解析输入‘正义’的错误”。怎么修呢?
发布于 2016-04-15 04:00:58
正如Daniel已经说过的,let绑定的内容需要比其模式更缩进。此外,您还需要在let … in块之外的do。如果你真的想使用三个let,你最终会得到这样的结果:
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的版本也违反了不要重复自己的规则:
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中)使它更加可读性:
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的语法)。发布于 2016-04-15 03:41:35
有两个问题:
let和of都引入了块。要正确解析,case/of块中的模式必须缩进多于let块中的模式。do块中,所以每个let都必须附带一个in。您只需使用一个in块就可以减少所需的let总数。加起来,这会让你:
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)https://stackoverflow.com/questions/36637677
复制相似问题