在haskell中使用Bool和其他数值类型

时间:2016-02-21 19:36:14

标签: haskell

在数值表达式中使用Bool类型是否有“优雅”的方法? 我目前的解决方案是使用fromIntegral.fromEnum,但似乎很长。 例如:

lst::[(Double, Double)]
lst = [(1, -1 * (odd i)) | i<- [1..]]

3 个答案:

答案 0 :(得分:1)

我不相信有一种标准方式。你当然可以写自己的:

enumToNum :: (Enum e, Num n) => e -> n
enumToNum = fromIntegral . fromEnum

这个和类似函数的存在确实指出了Enum类的愚蠢本质。

答案 1 :(得分:1)

Foreign.Marshal.Utils包含fromBool函数,其定义如下:

-- |Convert a Haskell 'Bool' to its numeric representation
--
fromBool       :: Num a => Bool -> a
fromBool False  = 0
fromBool True   = 1

虽然我不建议仅为fromBool导入此软件包,但您可以将其复制到代码中。

顺便说一句,在标准库中按类型发现函数的好方法是Hoogle

答案 2 :(得分:1)

我不明白将Bools解释为整数的一般目的,所以我只回答给出的例子。让我知道如何扩展我的答案。

lst::[(Double, Double)]
lst = [(1, -1 * (odd i)) | i<- [1..]]

元组的第一个元素始终为1,因此可以简化此示例。

lst :: [Double]
lst = [-1 * (odd i) | i<- [1..]]

对于读者,odd :: Integral a => a -> BoolfromEnum True = 1; fromEnum False = 0

fromEnum解释下,lst是一个散布有零的-1无限列表。我们还能如何实现这个清单?

intersperse 0 (repeat (-1))

然后我们如何找回所需的元组?将fmap (1,)应用于列表。