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