Haskell 如何删除平凡的参数?

Haskell 如何删除平凡的参数?,haskell,Haskell,我有一个定义如下的函数: errorWhenNothing :: Maybe a -> M (Maybe a) -- M is a Monad errorWhenNothing Nothing = throwError "is Nothing!" errorWhenNothing m = return m 参数m看起来微不足道,删除它会使函数更简单、更紧凑。问题是我无法将第二个定义改写为 errorWhenNothing = return GHC抱怨“errorWhenNothing”

我有一个定义如下的函数:

errorWhenNothing :: Maybe a -> M (Maybe a) -- M is a Monad
errorWhenNothing Nothing = throwError "is Nothing!"
errorWhenNothing m = return m
参数
m
看起来微不足道,删除它会使函数更简单、更紧凑。问题是我无法将第二个定义改写为

errorWhenNothing = return
GHC抱怨“errorWhenNothing”的方程式具有不同数量的参数。


我想知道有没有办法删除
m

是的,同一函数的不同子句不能有不同数量的参数。这主要是为了捕捉在其中一行中遗漏参数的常见错误,因此,它不是一个令人困惑的类型错误,而是直接告诉您做错了什么

如果您不希望
m
出现在那里,您可以使用
maybe
消除器释放整个点

errorWhenNothing :: Maybe a -> M a
errorWhenNothing = maybe (throwError "isNothing!") return

这是否是一种改进是一个意见问题。

为什么从
错误返回
可能是
而不是
?如果输入是
Nothing
,则计算将以
throwerr
终止。必须对函数的结果进行模式匹配似乎是不必要的工作,因为我们知道在这一点上它不是

也许我们可以这样重写函数:

errorWhenNothing :: Maybe a -> M a
errorWhenNothing Nothing = throwError "is Nothing!"
errorWhenNothing (Just a) = return a

现在,第二个子句不会原封不动地传递参数。

还有一个方法可以排除不同数量的参数;这不仅仅是为了捕捉一个简单的错误。@DanielWagner我真的不明白这和参数的数量有什么关系。怎么是
foo Nothing=;foo x=x
与“等式”
foo x=x
不同,这不是一个语义问题。当前规则具有以下优良特性:模式匹配是按顺序尝试的,是的,但一旦找到匹配的模式,所写的等式实际上是一个等式,您可以使用它来对程序进行推理。如果允许使用具有不同数量参数的等式,该链接将显示该属性将如何失败:我们将能够编写
foo=undefined
,并使其不是一个可用于推理的等式(即使之前的模式不匹配),因为真正的等式将是
foo=\\\\\\\->undefined
,这两者是可以区分的。