Haskell 指数函数的朴素实现
我正在尝试对指数函数进行简单的实现,如下所示:Haskell 指数函数的朴素实现,haskell,types,Haskell,Types,我正在尝试对指数函数进行简单的实现,如下所示: {-# LANGUAGE BangPatterns #-} fact :: (Integral a) => a -> a fact n = foldr (*) 1 [n,(n-1)..1] -- Sum of x^i / i! over i, from i=0 to i=n e' :: (Eq a, Integral a, Fractional a) => a -> a -> a e' _ 0 = 1.0 e' x
{-# LANGUAGE BangPatterns #-}
fact :: (Integral a) => a -> a
fact n = foldr (*) 1 [n,(n-1)..1]
-- Sum of x^i / i! over i, from i=0 to i=n
e' :: (Eq a, Integral a, Fractional a) => a -> a -> a
e' _ 0 = 1.0
e' x n = p / f + e' x (n-1)
where
!f = fact n
!p = x^n
但由于与show
相关的消息,我无法在控制台上显示结果,因此无法使其正常工作:
<interactive>:108:1:
No instance for (Show a0) arising from a use of 'print'
The type variable 'a0' is ambiguous
Note: there are several potential instances:
instance Show Double -- Defined in 'GHC.Float'
instance Show Float -- Defined in 'GHC.Float'
instance (Integral a, Show a) => Show (Ratio a)
-- Defined in 'GHC.Real'
...plus 90 others
In a stmt of an interactive GHCi command: print it
>
:108:1:
没有因使用“打印”而导致的(显示a0)实例
类型变量“a0”不明确
注意:有几个潜在的例子:
实例Show Double——在“GHC.Float”中定义
实例Show Float——在“GHC.Float”中定义
实例(积分a,显示a)=>显示(比率a)
--在“GHC.Real”中定义
…加上其他90人
在交互式GHCi命令的stmt中:打印它
>
我知道与Show
试图显示的类型有关,因此尝试强制转换它,但没有成功:e'1 15::Integer
类型(等式a,积分a,分数a)=>a->a->a
是由编译器推断出来的,尽管我最初想使用(等式a,积分a,分数b)=>a->a->b
,但没有成功
问题是:
1。我怎样才能使这个代码工作?我不明白如何正确地解决模棱两可的问题。
2。我如何使用其他类型(如果可能的话可能更合适)而不是
(等式a,积分a,分数a)=>a->a->a
?如注释中所述,没有类型同时是积分和分数的成员。您未能使用的类型确实是正确的类型,只是您需要将f
和p
从Integral
转换为从Integral
以下是经过适当修改的代码:
e :: (Eq a, Integral a, Fractional b) => a -> a -> b
e _ 0 = 1.0
e 1 _ = 1.0
e x n = p / f + e x (n-1)
where
!f = fromIntegral (fact n)
!p = fromIntegral (x^n)
没有同时为整数
和分数
的类型,因此默认设置不适用于您。当您在分数计算中使用积分值时(例如(/)
),需要将from integral
应用于积分值。默认设置是什么?编译器推断出的那些类。@OneEyeQuestion虽然编译器可能已推断出这两个类,但这并不意味着存在同时实现这两个类的类型。这些类型类没有什么特别之处,编译器不会因为它们是在base
中定义的而以不同的方式查看它们。从理论上讲,您可以定义一个同时实现这两种功能的类型,但它可能不会表现得很好。相反,我建议使用fromIntegral
(因为luqui有state)强制Integral
值。我尝试了fromIntegral p/fromIntegral f
,但不起作用。如问题中所述,我认为这与Show
无法决定显示哪种类型有关。@OneEyeQuestion Trye':(等式a,积分a,分数b)=>a->a->b
以及from Integral p/from Integral f
。这对我来说很好。