在数值表达式中使用Bool类型是否有“优雅”的方法?
我目前的解决方案是使用fromIntegral.fromEnum
,但似乎很长。
例如:
lst::[(Double, Double)]
lst = [(1, -1 * (odd i)) | i<- [1..]]
答案 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 -> Bool
和fromEnum True = 1; fromEnum False = 0
。
在fromEnum
解释下,lst
是一个散布有零的-1
无限列表。我们还能如何实现这个清单?
intersperse 0 (repeat (-1))
然后我们如何找回所需的元组?将fmap (1,)
应用于列表。