繁体   English   中英

Haskell:多路if表达式需要MultiWayIf启用

[英]Haskell: Multi-way if-expressions need MultiWayIf turned on

尝试使用“堆栈构建”进行构建:

module Main where


analyzeGold :: Int -> String
analyzeGold standard =
  if | standard == 999 -> "Wow! 999 standard!"
     | standard == 750 -> "Great! 750 standard."
     | standard == 585 -> "Not bad! 585 standard."
     | otherwise -> "I don't know such a standard..."

main :: IO ()
main = do
  putStrLn (analyzeGold 999)

我得到:

    Multi-way if-expressions need MultiWayIf turned on
  |
6 |   if | standard == 999 -> "Wow! 999 standard!"
  |   ^^

如何解决?

堆栈1.7.1,GHC 8.2.2

在Haskell中,只有if - then - else子句。 如果要使用这些“ 多if ”语句,请使用guard

使用警卫

你的语法已经相当接近保护,但它具备的if关键词,而等号( = )用来表示输出是在这种情况下什么。

因此,您应该将其重写为:

analyzeGold :: Int -> String
analyzeGold standard
    | standard == 999 = "Wow! 999 standard!"
    | standard == 750 = "Great! 750 standard."
    | standard == 585 = "Not bad! 585 standard."
    | otherwise = "I don't know such a standard..."

有关防护的语法和使用的某些信息,请参见此处[lyah]

使用模式 s

由于您的检查每次都会检查整数文字的相等性,因此我们实际上可以将检查从警戒移动到模式,例如:

analyzeGold :: Int -> String
analyzeGold 999 = "Wow! 999 standard!"
analyzeGold 750 = "Great! 750 standard."
analyzeGold 585 = "Not bad! 585 standard."
analyzeGold _ = "I don't know such a standard..."

下划线( _ )用作与所有值匹配的通配符 (以及与先前子句不匹配的所有模式)。

使用MultiWayIf扩展

您也可以通过在文件的头部写入一个编译指示或在调用解释器时使用-XMultiWayIf来启用GHCi扩展来启用此扩展。 所以:

{-# LANGUAGE MultiWayIf #-}

analyzeGold :: Int -> String
analyzeGold standard =
    if | standard == 999 -> "Wow! 999 standard!"
       | standard == 750 -> "Great! 750 standard."
       | standard == 585 -> "Not bad! 585 standard."
       | otherwise -> "I don't know such a standard..."

要么:

$ ghci -XMultiWayIf
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Prelude> :{
Prelude| analyzeGold :: Int -> String
Prelude| analyzeGold standard =
Prelude|     if | standard == 999 -> "Wow! 999 standard!"
Prelude|        | standard == 750 -> "Great! 750 standard."
Prelude|        | standard == 585 -> "Not bad! 585 standard."
Prelude|        | otherwise -> "I don't know such a standard..."
Prelude| :}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM