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 Try
e':(等式a,积分a,分数b)=>a->a->b
以及
from Integral p/from Integral f
。这对我来说很好。