9

我在我的代码中做这种事情:

data MyType = Cons1 a b
data OtherType = OtherType
             { val1 :: Int
             , val2 :: String
             , val3 :: Maybe MyType
             }

我想知道将代码更改为此是否会更简洁/更简单,以及优点/缺点是什么:

data MyType = Cons1 a b | Missing
data OtherType = OtherType
             { val1 :: Int
             , val2 :: String
             , val3 :: MyType
             }

我正在做的是将文件中的行读入 [OtherType],每行有 4 列,例如第 3 列和第 4 列用于创建 val3 :: MyType。目前我正在使用 readMaybe 读取 a 和 b,然后将它们传递给一个函数,如果它们中的任何一个是 Nothing,则返回 Nothing,如果它们是 Just a 和 Just b,则返回 Just MyType。我在想我可以将其更改为返回 Missing ,从而去除一层包装。

4

2 回答 2

22

仅当所有值都可能有意义时才应将Missing构造函数添加到. 您必须处理所有处理值的函数。如果其中大多数不是全部的——抛出错误或以其他方式失败——那么显然不属于,你应该改用。MyTypeMyTypeMissingMissingMyTypeMissingMyTypeMaybe MyType

简单地说:如果可选性是类型固有的,则在类型中对其进行编码。否则,请将其分开。

于 2013-04-17T07:54:21.903 回答
10

第二种方法有两个小优点:

  1. 通过削减间接级别,您编写的函数和遍历 值的函数OtherType通常会变得更简单(但并不引人注目)。
  2. 通过为添加的空值构造函数选择一个好名称,您的代码可能会变得更加不言自明(与Nothing在各个地方使用相当通用的名称相比)。

一个很大的缺点是您无法使用标准库为您提供的所有预定义函数来处理Maybe-values,并且您必须自己编写相应的功能。

于 2013-04-17T07:59:20.747 回答