首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈斯克尔式系统解释?

哈斯克尔式系统解释?
EN

Stack Overflow用户
提问于 2018-07-08 13:37:12
回答 2查看 105关注 0票数 0

我无法调用该函数进行编译。所有的评论调用都是失败的尝试。请告知,也有任何好的解释哈斯基尔斯类型的系统在那里??

代码语言:javascript
复制
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 )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-08 13:58:22

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

代码语言:javascript
复制
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用于部门。

代码语言:javascript
复制
(/) :: Fractional a => a -> a -> a
div :: Integral   a => a -> a -> a
票数 5
EN

Stack Overflow用户

发布于 2018-07-09 10:57:26

IntegralFractional不仅在标准库中没有重叠,而且在术语上形成了矛盾。积分(2)表示这个数字没有小数部分(在小数点之后),而分数(1)则表示它可以。这是类型类描述的一种属性。

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

代码语言:javascript
复制
isInt :: RealFrac a => a -> Bool
isInt n = snd (properFraction n) == 0

RealFrac表示这个数字既是小数,又是真品Complex数字支持除法,但对于小数部分却没有一个定义。

考虑到您想要检查一个数字是否是素数,并且只有正整数可以是素数,我们可以选择将测试简化为只处理整型:

代码语言:javascript
复制
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提供非空列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51232542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档