我有一个像这样的数据结构
data Sample = Sample { a :: String , b :: String }
和一个函数
mkSample :: String -> String -> Sample
mkSample a b = Sample a b
我想为a,b提供一些默认值,以防调用函数不提供它们,例如
mkSample :: String -> Sample
mkSample a = Sample a "test"
1)我觉得这个解决方案并不优雅,我还有什么其他选择。 2)如何为b创建一个mkSample,因为类型与a相同。
答案 0 :(得分:6)
data Sample = Sample { a :: String , b :: String }
defaultSample :: Sample
defaultSample = Sample "test" "value_b"
然后您可以使用记录语法:
let mySample = defaultSample { b = "custom value" }
...
答案 1 :(得分:2)
Maybe
是针对这种情况而设计的:
mkSample :: Maybe String -> Maybe String -> Sample
mkSample ma mb = Sample (maybe "default a" id ma) (maybe "default b" id mb)
-- NB: maybe :: b -> (a -> b) -> Maybe a -> b
这样,如果没有可用的字符串,您可以只提供一个Nothing
:
λ> mkSample Nothing (Just "World!")
Sample "default a" "World!"
λ> mkSample (Just "Hello,") Nothing
Sample "Hello," "default b"
λ> mkSample Nothing Nothing
Sample "default a" "default b"