我在我的代码中做了这种事情:
data MyType = Cons1 a b
data OtherType = OtherType
{ val1 :: Int
, val2 :: String
, val3 :: Maybe MyType
}
Run Code Online (Sandbox Code Playgroud)
我想知道将代码更改为更简洁/更简单以及优缺点是什么:
data MyType = Cons1 a b | Missing
data OtherType = OtherType
{ val1 :: Int
, val2 :: String
, val3 :: MyType
}
Run Code Online (Sandbox Code Playgroud)
我正在做的是从文件中读取行到[OtherType],每行有4列,第3列和第4列用于创建val3 :: MyType.目前我正在使用readMaybe来读取a和b然后将它们传递给一个函数,如果它们中的任何一个是Nothing,则返回Nothing,如果它们是Just a和Just b则返回Just.我以为我可以改变这个以返回Missing,从而删除一层包装.
Jon*_*rdy 22
您应该只添加Missing构造函数,MyType如果所有MyType值都有可能的话Missing.您必须处理Missing处理MyType值的所有函数.如果这些中的大多数都是非全抛出错误或者以其他方式失败 - 那么显然Missing不属于此类MyType而你应该使用Maybe MyType.
简单地说:如果选项是类型中固有的,则在类型中对其进行编码.否则,请将其分开.
Ste*_*ans 10
第二种方法有两个小优点:
OtherType通常会变得更简单(但不是非常引人注目).Nothing在各个地方使用相当通用的名称相比).一个很大的缺点是你失去了使用标准库为你提供的所有预定义函数的能力Maybe以及你必须自己编写相应功能的代码.