从无限浮点列表中删除零

dmv*_*nna 1 haskell list-comprehension quickcheck

我想从无限的浮动列表中进行采样,以便进行QuickCheck消费.但是,由于我打算使用除法,我想从该列表中删除.这是一个概念上简单的问题,我想知道我是否可以用列表理解来做,如果没有,哪个是在Haskell中实现这个的最简单方法?

[x | x <- floats, x /= 0] -- this seems reasonable, but where do I get floats from?
Run Code Online (Sandbox Code Playgroud)

我目前的解决方法(哎呀):

import Test.QuickTest

divGen :: Gen (Maybe Float)
divGen = do
    x <- arbitrary
    if x /= 0
    then return $ Just x
    else return Nothing
Run Code Online (Sandbox Code Playgroud)

Cac*_*tus 6

您可以arbitrary使用suchThatQuickCheck 的组合子生成满足给定谓词的值:

divisor :: Gen Float
divisor = arbitrary `suchThat` (/= 0)
Run Code Online (Sandbox Code Playgroud)

用法示例:

my_prop x = forAll divisor $ \d -> (x / d) * d =~= x
Run Code Online (Sandbox Code Playgroud)


Zet*_*eta 5

那已经在QuickCheck中,即NonZero.您的无限浮动列表可以建模为

nonZeroFloat :: Gen Float
nonZeroFloat = fmap getNonZero arbitrary

-- You probably want to use a shorter name:
infiniteListOfNonZeroFloats :: Gen [Float]
infiniteListOfNonZeroFloats = infiniteListOf nonZeroFloat
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用forAll:

prop_something = forAll infiniteListOfNonZeroFloats $ \xs -> ...
-- or
prop_something = forAll (infinitelistOf $ getNonZero `fmap` arbitrary) $ \xs ->
                    ...
Run Code Online (Sandbox Code Playgroud)

请注意,使用NonZero模式匹配可以更顺畅:

prop_nonzero :: NonZero Float -> ...
prop_nonzero (NonZero x) = ...
Run Code Online (Sandbox Code Playgroud)