Haskell类型系统说明?

时间:2018-07-08 13:37:12

标签: haskell types

我无法调用该函数进行编译。所有评论的通话 是失败的尝试。请指教,也有什么好的解释 的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 )

2 个答案:

答案 0 :(得分:6)

Prelude中没有同时属于IntegralFractional的实例的类型,因此您需要选择一个或另一个约束并坚持使用。您可以使用以下函数进行转换:

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)

IntegralFractional在标准库中不仅不重叠,而且在术语上形成矛盾。 Integral(2)指出数字没有小数部分(在小数点后),而fractional(1)指出可以。这是类型类描述的一种属性。

对于Fractional类型,您可以使用以下方法检查小数部分是否为零:

isInt :: RealFrac a => a -> Bool
isInt n = snd (properFraction n) == 0

RealFrac指出该数字既是小数又是realComplex数字支持除法,但对分数部分没有统一定义。

考虑到您要检查数字是否为质数,并且只有正整数可以为质数,我们可以选择将测试减少为仅处理整数类型:

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提供了非空列表。