Haskell:将Bool视为Int

Gab*_*ega 4 haskell

如何实现一个以int开头的函数,并且每次从它中减去1(通过有限数量的可能性),其中一个(例如,5个)布尔值返回1.

理想情况下看起来如何:

function list1 list2 = num
  where
      num = 4
          - (condition from var1 = true)
          - (condition from var2 = true)
          - (so on, so forth as long as needed)
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的实现这些行:

      num = startVal
          - (list1conditional == desiredVal)
          - (etc)
Run Code Online (Sandbox Code Playgroud)

但这是返回类型错误.

Wil*_*sem 8

Bool是一个实例Enum:你可以枚举a Bool:的两个值False,然后True.

其结果是,它实现了fromEnum :: Enum a => a -> Int,一个映射的值的函数Enum类型到Int:要Bool,它映射False0True1.

所以我们可以这样使用:

result = 5 - fromEnum cond1 - fromEnum cond2
Run Code Online (Sandbox Code Playgroud)

或者例如条件列表:

result = 5 - sum (map fromEnum [cond1, cond2, cond3])
Run Code Online (Sandbox Code Playgroud)

where cond1cond2等是类型的表达式Bool.

  • @JonasDeSchouwer:您可以使用“toEnum 0 :: Bool”将“0”转换为“False”,将“1”转换为“True”。但这会引发“0”/“1”范围之外的值的错误。 (2认同)