Haskell 可选类型参数
Haskell optional type parameter
在haskell中,如何定义一个可选的类型参数:
data Car a b c = Car { company :: a
, model :: b
, year :: c
}
-- I want to return this type if `c` is not provided
data Car a b = Car { company :: a
, model :: b
}
在上面,我想要一个可选类型 c
并且根据是否提供它 return 一个稍微不同的类型。我该怎么做呢?我这样做完全错了吗?
根据您的具体要求,我熟悉不同的方法。但首先,我不清楚您是否希望对这些类型进行参数化。即我怀疑您真正想要的是:
data Car = Car { company :: Company
, model :: String
, year :: Int
}
特别是您似乎不太可能需要 year
的单独表示。如果是这样,那么你的问题的答案(如何使年份可选是:
data Car = Car { company :: Company
, model :: String
, year :: Maybe Int -- N.B. Maybe
}
如果你真的想问一个可选的参数化类型,那么你可以这样做:
data Foo a = Foo Int Char a
当您希望将其视为"a Foo without the last parameter" 时,您可以将其用作Foo ()
。如果你愿意,你可以进一步围绕它制作一个新的包装器。
newtype FooWithoutA = FooWithoutA (Foo ())
由于单位类型 ()
只有一个值,这表明该字段没有任何意义。
旁白:您可能也有兴趣阅读 http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/,这会让您了解为什么不同的数据结构方式是等价的,以及其他见解。
在haskell中,如何定义一个可选的类型参数:
data Car a b c = Car { company :: a
, model :: b
, year :: c
}
-- I want to return this type if `c` is not provided
data Car a b = Car { company :: a
, model :: b
}
在上面,我想要一个可选类型 c
并且根据是否提供它 return 一个稍微不同的类型。我该怎么做呢?我这样做完全错了吗?
根据您的具体要求,我熟悉不同的方法。但首先,我不清楚您是否希望对这些类型进行参数化。即我怀疑您真正想要的是:
data Car = Car { company :: Company
, model :: String
, year :: Int
}
特别是您似乎不太可能需要 year
的单独表示。如果是这样,那么你的问题的答案(如何使年份可选是:
data Car = Car { company :: Company
, model :: String
, year :: Maybe Int -- N.B. Maybe
}
如果你真的想问一个可选的参数化类型,那么你可以这样做:
data Foo a = Foo Int Char a
当您希望将其视为"a Foo without the last parameter" 时,您可以将其用作Foo ()
。如果你愿意,你可以进一步围绕它制作一个新的包装器。
newtype FooWithoutA = FooWithoutA (Foo ())
由于单位类型 ()
只有一个值,这表明该字段没有任何意义。
旁白:您可能也有兴趣阅读 http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/,这会让您了解为什么不同的数据结构方式是等价的,以及其他见解。