如何删除琐碎的参数?

hli*_*liu 2 haskell

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

errorWhenNothing :: Maybe a -> M (Maybe a) -- M is a Monad
errorWhenNothing Nothing = throwError "is Nothing!"
errorWhenNothing m = return m
Run Code Online (Sandbox Code Playgroud)

该参数m似乎微不足道,删除它使功能更简单,更紧凑.问题是我无法重写第二个定义

errorWhenNothing = return
Run Code Online (Sandbox Code Playgroud)

GHC抱怨 Equations for 'errorWhenNothing' have different numbers of arguments..

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

luq*_*qui 7

是的,你不能为同一个函数的不同子句提供不同数量的参数.它主要是为了捕捉在其中一行上省略参数的常见错误,因此它不是一个令人困惑的类型错误,而是直接告诉你你做错了什么.

如果你不想要m那里,你可以使用maybe消除器完全无关紧要

errorWhenNothing :: Maybe a -> M a
errorWhenNothing = maybe (throwError "isNothing!") return
Run Code Online (Sandbox Code Playgroud)

这是否有所改善是一个意见问题.


dan*_*iaz 6

为什么返回MaybeerrorWhenNothing?如果输入是Nothing,则throwError无论如何都会中止计算.必须对函数的结果进行模式匹配似乎是不必要的工作,因为我们知道它不是Nothing.

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

errorWhenNothing :: Maybe a -> M a
errorWhenNothing Nothing = throwError "is Nothing!"
errorWhenNothing (Just a) = return a
Run Code Online (Sandbox Code Playgroud)

现在第二个子句不传递参数不变.