gpt4 book ai didi

haskell - Haskell 中的函数相等

转载 作者:行者123 更新时间:2023-12-03 21:11:38 26 4
gpt4 key购买 nike

我正在尝试定义一个函数,该函数将采用 Double -> Double函数并返回其数学导数。我尝试过执行以下操作:

der :: (Double -> Double) -> (Double -> Double)
der f
| f == exp = exp
| otherwise = undefined

但是 Haskell 不支持 ==Double -> Double值(value)观。我在 Haskell 中尝试做的事情是不可能的吗?

最佳答案

是的,您尝试做的事情在 Haskell 中是不可能的,并且通常:确定两个函数是否对于所有可能的输入都相等(而不只是检查每个输入值,如果这甚至可能的话)等同于解决停止问题。

但是,在您的特定情况下,您可以使用模拟 Double 的自定义类型来绕过它。 (即具有相同的实例,因此可以用来代替它)但不是对数字求值,而是构造函数所做操作的抽象表示。 Expr表示数学函数定义的右侧 f(x) = ... .

data Expr = X | Const Double |
Add Expr Expr | Mult Expr Expr |
Negate Expr | Inverse Expr |
Exp Expr | Log Expr | Sin Expr | ...
deriving (Show, Eq)

instance Num Expr where
(+) = Add
(*) = Mult
...
instance Fractional Expr where
recip = Inverse
...
instance Floating Expr where
pi = Const pi
exp = Exp
log = Log
sin = Sin
...

然后,使用 rank-2 types ,您可以定义转换函数,在接受任何 Floating 的函数之间进行转换。和 Expr年代:
{-# LANGUAGE Rank2Types #-}

fromFunction :: (forall a. Floating a => (a -> a)) -> Expr
fromFunction f = f X

toFunction :: Expr -> (Double -> Double)
toFunction X = \x -> x
toFunction (Const a) = const a
toFunction (Add a b) = \x -> (toFunction a x) + (toFunction b x)
...

也可以定义函数 diff :: Expr -> Expr区分表达式:
diff X = Const 1
diff (Const _) = Const 0
diff (Add a b) = Add (diff a) (diff b)
diff (Exp a) = Mult (diff a) (Exp a)
...

拥有所有这些部分应该意味着您可以区分(某些)功能,例如
f x = sin x + cos x * exp x
f' = toFunction . diff . fromFunction $ f

注意事项:
  • 这通常不起作用,
  • 定义一个完整的Eq Expr 的实例很棘手(它相当于 Halting 问题,因为它基本上是在询问两个函数是否相等),
  • 我还没有实际测试过这些代码,
  • 微分和重建是在运行时完成的,因此生成的函数很可能很慢。
  • 关于haskell - Haskell 中的函数相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906628/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com