部分记录的安全替代方案?

use*_*399 5 haskell

我正试图找出一种合理的方法让我的图书馆用户为我提供一系列功能来控制它的行为方式.我想为他们提供一些默认值,他们可以根据自己的需要进行组合和覆盖.显而易见的方式(对我来说)只是一个类似函数的记录,Foo {a, b, c, d, e}并使它成为一个monoid,然后提供一些默认值mappend.但我制作的默认值不会提供所有功能.所以我可能有一个记录,{a, b}一个{c, d}和另一个{b, c, e}.这显然是不安全的,并且用户可以向我提供类似记录的记录{a, b, c, e}.我希望用户能够混合和匹配这样的部分,但仍然必须以完整的记录结束.

有没有一种安全的方法来做这样的事情?如果我将记录中的所有函数都设置为Maybe函数,那么我至少可以这样做,以便我可以检查提供的值是否缺少函数,但是它们仍然在运行时而不是编译时获得该错误.如果可以的话,我宁愿让"必须提供记录中的所有字段"由编译器强制执行.

Sib*_*ibi 5

您正在寻找data-default包。使用它,您可以安全地为您的类型初始化默认值。例子:

import Data.Default

data Foo = Foo { a :: Int, b :: Int }

instance Default Foo where
  def = Foo 3 3
Run Code Online (Sandbox Code Playgroud)

现在使用def您可以在您需要的任何函数中使用默认值:

dummyFun :: Foo -> Foo
dummyFun x = def
Run Code Online (Sandbox Code Playgroud)

您还可以根据需要更改记录值:

dummyFun :: Foo -> Foo
dummyFun x = def { b = 8 }
Run Code Online (Sandbox Code Playgroud)