如何在记录中设置默认值
How do I set default values in a record
我正在尝试在可以覆盖的记录对象中设置默认值。
data Car c y = Car {
company :: c,
year :: y
}
我想做的是设置一个默认值:
data Car c y = Car {
company :: c -- OR "Ford"
year :: y
}
到目前为止,我已经尝试通过将 c 的类型设置为 Maybe
类型来执行此操作:
data Car = Car {
company:: Maybe String
year :: Maybe Int
}
但是我得到了这个可预测的错误:
Fields of `Car' not initialised: year
具有讽刺意味的是,这正是我要解决的问题。我想生成一个新记录,其中包含我未设置的已初始化值。我发现的一种方法是部分应用 Car
类型:
data Car c y = {
company :: c,
year :: y
}
let ford = Car "Ford"
-- This produces a function (y -> Car [Char] y)
但是这会产生 2 个新问题:
如果我的数据类型有 100 多个字段类型,我将得到 100 个柯里化阶乘函数
我可以创建的部分应用函数取决于声明中变量的顺序。例如,您会注意到我无法生成 car1988
函数。
如何编写允许我使用默认值创建记录的函数?请帮忙。
就是这样 Haskell prefers to handle in a library,而不是破解一些硬连线的语言支持(这可能会导致各种问题,就像在 C++ 中一样)。
import Data.Default
instance Default Car where
def = Car Nothing Nothing
-- or whatever you want as the defaults
ford :: Car
ford = def { company = Just "Ford" }
GHCi> ford
Car {company = Just "Ford", year = Nothing}
除了使用 Default
class,您还可以只定义 defaultCar
.
如果您的系统中尚未安装 cabal,您可能需要使用它来安装 data-default
。
我会在使用 Data.Text 时使用稍微冗长的方法。
{-#Language OverloadedString#-}
import Data.Text as T
data Car c y = Car {
company :: Text
year :: Double
}
toCar :: [T.Text] -> Car
toCar inp = case inp of
[] -> fail "Give me an input"
[v:h] -> Car { company = justifyRight 1 "Ford" h
, year = read $ T.unpack $ last inp
}
这将接收 inp ["8"]
和 inp ["Ashburn", "8"]
等输入
我正在尝试在可以覆盖的记录对象中设置默认值。
data Car c y = Car {
company :: c,
year :: y
}
我想做的是设置一个默认值:
data Car c y = Car {
company :: c -- OR "Ford"
year :: y
}
到目前为止,我已经尝试通过将 c 的类型设置为 Maybe
类型来执行此操作:
data Car = Car {
company:: Maybe String
year :: Maybe Int
}
但是我得到了这个可预测的错误:
Fields of `Car' not initialised: year
具有讽刺意味的是,这正是我要解决的问题。我想生成一个新记录,其中包含我未设置的已初始化值。我发现的一种方法是部分应用 Car
类型:
data Car c y = {
company :: c,
year :: y
}
let ford = Car "Ford"
-- This produces a function (y -> Car [Char] y)
但是这会产生 2 个新问题:
如果我的数据类型有 100 多个字段类型,我将得到 100 个柯里化阶乘函数
我可以创建的部分应用函数取决于声明中变量的顺序。例如,您会注意到我无法生成
car1988
函数。
如何编写允许我使用默认值创建记录的函数?请帮忙。
就是这样 Haskell prefers to handle in a library,而不是破解一些硬连线的语言支持(这可能会导致各种问题,就像在 C++ 中一样)。
import Data.Default
instance Default Car where
def = Car Nothing Nothing
-- or whatever you want as the defaults
ford :: Car
ford = def { company = Just "Ford" }
GHCi> ford
Car {company = Just "Ford", year = Nothing}
除了使用 Default
class,您还可以只定义 defaultCar
.
如果您的系统中尚未安装 cabal,您可能需要使用它来安装 data-default
。
我会在使用 Data.Text 时使用稍微冗长的方法。
{-#Language OverloadedString#-}
import Data.Text as T
data Car c y = Car {
company :: Text
year :: Double
}
toCar :: [T.Text] -> Car
toCar inp = case inp of
[] -> fail "Give me an input"
[v:h] -> Car { company = justifyRight 1 "Ford" h
, year = read $ T.unpack $ last inp
}
这将接收 inp ["8"]
和 inp ["Ashburn", "8"]