我无法调用该函数进行编译。所有的评论调用都是失败的尝试。请告知,也有任何好的解释哈斯基尔斯类型的系统在那里??
import Data.Numbers.Primes
import Data.List
--isInt:: Fractional a => a -> Bool
isInt x =
x == fromInteger (round x)
doForm :: (Integral int, Fractional int) => int -> int -> Bool
doForm cube n =
isPrime (divide - n)
where divide = cube / (n^2)
main =
-- print $ doForm (12^3 8)
-- print $ doForm (12^3::Integer 8::Integer )
-- print $ doForm ( fromIntegral 12^3 fromIntegral 8)
-- print $ doForm (toInteger 12^3 toInteger 8)
-- print $ doForm (toInteger 12^3 toInteger (8) )
-- print $doForm (round 12^3) ( round 8)
-- print $doForm (floor 12^3) ( floor 8)
-- print $doForm ( 12^3::Fractional 8::Fractional)
-- print $doForm ( 12^3 8)::Fractional
-- print $doForm (12^3 :: RealFrac 8::RealFrac )发布于 2018-07-08 13:58:22
Prelude中没有Integral和Fractional的实例类型,因此您需要选择一个或另一个约束并坚持使用它。您可以使用这样的函数进行转换:
fromIntegral :: (Integral a, Num b) => a -> b -- Num is a superclass of Fractional
floor, ceiling, round :: (RealFrac a, Integral b) => a -> b -- Fractional is a superclass of RealFrac您还可能需要仔细考虑是否希望(/)或div用于部门。
(/) :: Fractional a => a -> a -> a
div :: Integral a => a -> a -> a发布于 2018-07-09 10:57:26
Integral和Fractional不仅在标准库中没有重叠,而且在术语上形成了矛盾。积分(2)表示这个数字没有小数部分(在小数点之后),而分数(1)则表示它可以。这是类型类描述的一种属性。
对于Fractional类型,可以使用以下方法检查小数部分是否为零:
isInt :: RealFrac a => a -> Bool
isInt n = snd (properFraction n) == 0RealFrac表示这个数字既是小数,又是真品。Complex数字支持除法,但对于小数部分却没有一个定义。
考虑到您想要检查一个数字是否是素数,并且只有正整数可以是素数,我们可以选择将测试简化为只处理整型:
doForm :: Integral int => int -> int -> Bool
doForm cube n = case remainder of
0 -> isPrime (quotient - n)
_ -> False
where (quotient,remainder) = cube `quotRem` (n^2)
main =
print $ doForm (12^3) 8一个数字是正数或非负数是另一个属性,它可能是在类型系统(例如Ada有范围整数)中表达的,但哈斯克尔的前奏曲却并非如此。Haskell报告第6.3节,标准Haskell类列出了标准Haskell中的类型类。其他包可能会扩展这一点,例如nat提供正整数和非负整数,NonEmpty提供非空列表。
https://stackoverflow.com/questions/51232542
复制相似问题