我无法调用该函数进行编译。所有评论的通话 是失败的尝试。请指教,也有什么好的解释 的Haskels类型系统?
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 )
答案 0 :(得分:6)
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
答案 1 :(得分:0)
Integral
和Fractional
在标准库中不仅不重叠,而且在术语上形成矛盾。 Integral(2)指出数字没有小数部分(在小数点后),而fractional(1)指出可以。这是类型类描述的一种属性。
对于Fractional
类型,您可以使用以下方法检查小数部分是否为零:
isInt :: RealFrac a => a -> Bool
isInt n = snd (properFraction n) == 0
RealFrac
指出该数字既是小数又是real。 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 has ranged integers)中可能表达的另一种属性,但Haskell的序言却没有。 Haskell report section 6.3, standard Haskell Classes列出了标准Haskell中的类型类。其他软件包可能会对此进行扩展,例如nat提供了正整数和非负整数,而NonEmpty提供了非空列表。