如何更新函数以在Haskell中的某个输入上生成不同的值

时间:2014-04-08 12:12:13

标签: function haskell

我对Haskell很新,我试图了解更高阶的功能。我想创建一个更新函数,以便我可以按如下方式调用它:

if somefunc' = update sumfunc 42 "y", then
   somefunc' x = { 42           if x  = "y"
                   (somefunc x) if x != "y"}

我尝试写这样的东西:

update :: Eq a => (a->b) -> b -> a -> (a->b)
update f x y = f_new
        where   f_new :: a -> b
                f_new y = x
                f_new _ = f

我知道它可能完全不正确但是如果你能给我一个方法来做这个,同时保持更新的签名使用它将是非常有帮助的。谢谢

1 个答案:

答案 0 :(得分:2)

你不能对变量进行模式匹配,并期望它变成某种等式测试。变量模式总是匹配任何东西。如果你想进行相等测试,请使用警卫。

此外,您不能像使用where子句那样使用类型签名,因为本地函数实际上并不是多态的。 (如果你想要这样的东西,你需要ScopedTypeVariables语言扩展。)

在最后一行中,有一个类型错误,因为你匹配一个参数但是然后返回函数f而不是应用它。

总而言之,您的代码看起来应该更像这样:

update :: Eq a => (a -> b) -> b -> a -> (a -> b)
update f x y = f_new
  where
    f_new z | z == y    = x
            | otherwise = f z