在Haskell中创建不带参数的函数时解析错误

0 haskell

我正在尝试创建一个不带参数的函数,以创建列表推导。当我尝试运行代码时,出现解析错误,并且编译失败,我也不知道为什么。

我一直试图在终端上运行它,但是它不起作用。

这是我的代码:

outfits = let pants = ["jeans", "khaki", "leggings"]
              shirts = ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
              shoes = ["brogues", "converse", "sandals", "adidas"]

outfits1 = [ (x, y, z) | z <- pants, y <- shirts, x <- shoes ]
Run Code Online (Sandbox Code Playgroud)

这是出现的错误:

warmup.hs:7:11: error: parse error on input ‘outfits1’
  |
7 |           outfits1 = [ (x, y, z) | z <- pants, y <- shirts, x <- shoes ]
  |           ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

che*_*ner 7

没有let表达式,您只需写

outfits = [ (x, y, z) | z <- ["jeans", "khaki", "leggings"], y <- ["white shirt", "grey turtleneck", "pink polo", "green hoodie"], x <- ["brogues", "converse", "sandals", "adidas"] ]
Run Code Online (Sandbox Code Playgroud)

甲let表达需要两个部分:本地绑定立即关键字以下let,以及使用那些绑定的表达,关键字以下in:

outfits = let pants = ["jeans", "khaki", "leggings"]
              shirts = ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
              shoes = ["brogues", "converse", "sandals", "adidas"]
          in [ (x, y, z) | z <- pants, y <- shirts, x <- shoes ]
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用where子句来编写此代码,该子句将“ main”表达式放在第一位:

outfits = [ (x, y, z) | z <- pants, y <- shirts, x <- shoes ]
              where pants = ["jeans", "khaki", "leggings"]
                    shirts = ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
                    shoes = ["brogues", "converse", "sandals", "adidas"]
Run Code Online (Sandbox Code Playgroud)

Applicative 而不是列表理解

我会用写这个Applicative实例列表,而不是使用3元组的构造(,,),它可以让你与样板变量做掉x,y和z。

outfits = (,,) <$> ["jeans", "khaki", "leggings"]
               <*> ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
               <*> ["brogues", "converse", "sandals", "adidas"]
Run Code Online (Sandbox Code Playgroud)

您仍然可以使用let表达式或where子句为服装的每个组件提供名称:

outfits = let pants = ["jeans", "khaki", "leggings"]
              shirts = ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
              shoes = ["brogues", "converse", "sandals", "adidas"]
          in (,,) <$> pants <*> shirts <*> shoes
Run Code Online (Sandbox Code Playgroud)

要么

outfits = (,,) <$> pants <*> shirts <*> shoes
              where pants = ["jeans", "khaki", "leggings"]
                    shirts = ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
                    shoes = ["brogues", "converse", "sandals", "adidas"]
Run Code Online (Sandbox Code Playgroud)

如果... <$> ... <*> ... <*> ...看起来太深奥,您可以为模式指定一个更具描述性的名称:

outfits = mixAndMatch pants shirts shoes
           where pants = ["jeans", "khaki", "leggings"]
                 shirts = ["white shirt", "grey turtleneck", "pink polo", "green hoodie"]
                 shoes = ["brogues", "converse", "sandals", "adidas"]
                 mixAndMatch a b c = (,,) <$> a <*> b <*> c
Run Code Online (Sandbox Code Playgroud)

  • mixAndMatch = liftA3(,,),即使您不喜欢应用样式,它也更适合内联。 (2认同)