Use dependent types for downcasting?
Here's code I have:
sealed trait Section {
val value:String
type Out
}
case object AUTO_LOANS extends Section{
val value="auto-loans"
type Out = AUTO_LOANS.type
}
case object STUDENT extends Section{
val value="student"
type Out = STUDENT.type
}
object Section {
def apply(s:String):Option[Section] = s match {
case "auto-loans" => Some(AUTO_LOANS)
case "student" => Some(STUDENT)
case _ =>None
}
}
and
sealed trait UserTypeFinder[A] {
def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User]
}
object UserTypeFinder {
def apply[A](implicit utf: UserTypeFinder[A]): UserTypeFinder[A]=utf
}
implicit val autoLoans = new UserTypeFinder[AUTO_LOANS.type] {
override def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User] = { .. }
}
def findUser[A: UserTypeFinder](section: A, fs: Set[Fact], fv: Option[FactVector]): Option[User] = {
UserTypeFinder[A].user(fs, fv)
}
now I do:
findUser(Section("auto-loans"),Set(),None)
the type of Section("auto-loans")
is Section
not AUTO_LOANS.
I'd like to preserve type for the type classes to work.
I've looked at shapeless dependent types so I was thinking of storing type Out in each case object (as seen above) then after getting the object casting it to Out:
val auto0=Section("auto-loans")
val v0=auto0.asInstanceOf[auto0.Out]
now the type of v0
is Out
instead of AUTO_LOANS
so this solves nothing.
Any ideas how to preserve types or how to get them at compile time? I'm not quite sure if I can use Aux
for this. Any ideas?
scala type-conversion shapeless dependent-type downcasting
add a comment |
Here's code I have:
sealed trait Section {
val value:String
type Out
}
case object AUTO_LOANS extends Section{
val value="auto-loans"
type Out = AUTO_LOANS.type
}
case object STUDENT extends Section{
val value="student"
type Out = STUDENT.type
}
object Section {
def apply(s:String):Option[Section] = s match {
case "auto-loans" => Some(AUTO_LOANS)
case "student" => Some(STUDENT)
case _ =>None
}
}
and
sealed trait UserTypeFinder[A] {
def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User]
}
object UserTypeFinder {
def apply[A](implicit utf: UserTypeFinder[A]): UserTypeFinder[A]=utf
}
implicit val autoLoans = new UserTypeFinder[AUTO_LOANS.type] {
override def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User] = { .. }
}
def findUser[A: UserTypeFinder](section: A, fs: Set[Fact], fv: Option[FactVector]): Option[User] = {
UserTypeFinder[A].user(fs, fv)
}
now I do:
findUser(Section("auto-loans"),Set(),None)
the type of Section("auto-loans")
is Section
not AUTO_LOANS.
I'd like to preserve type for the type classes to work.
I've looked at shapeless dependent types so I was thinking of storing type Out in each case object (as seen above) then after getting the object casting it to Out:
val auto0=Section("auto-loans")
val v0=auto0.asInstanceOf[auto0.Out]
now the type of v0
is Out
instead of AUTO_LOANS
so this solves nothing.
Any ideas how to preserve types or how to get them at compile time? I'm not quite sure if I can use Aux
for this. Any ideas?
scala type-conversion shapeless dependent-type downcasting
Possible duplicate of Function that retrieves element from HList (while preserving its type)
– Dmytro Mitin
Nov 20 '18 at 10:10
add a comment |
Here's code I have:
sealed trait Section {
val value:String
type Out
}
case object AUTO_LOANS extends Section{
val value="auto-loans"
type Out = AUTO_LOANS.type
}
case object STUDENT extends Section{
val value="student"
type Out = STUDENT.type
}
object Section {
def apply(s:String):Option[Section] = s match {
case "auto-loans" => Some(AUTO_LOANS)
case "student" => Some(STUDENT)
case _ =>None
}
}
and
sealed trait UserTypeFinder[A] {
def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User]
}
object UserTypeFinder {
def apply[A](implicit utf: UserTypeFinder[A]): UserTypeFinder[A]=utf
}
implicit val autoLoans = new UserTypeFinder[AUTO_LOANS.type] {
override def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User] = { .. }
}
def findUser[A: UserTypeFinder](section: A, fs: Set[Fact], fv: Option[FactVector]): Option[User] = {
UserTypeFinder[A].user(fs, fv)
}
now I do:
findUser(Section("auto-loans"),Set(),None)
the type of Section("auto-loans")
is Section
not AUTO_LOANS.
I'd like to preserve type for the type classes to work.
I've looked at shapeless dependent types so I was thinking of storing type Out in each case object (as seen above) then after getting the object casting it to Out:
val auto0=Section("auto-loans")
val v0=auto0.asInstanceOf[auto0.Out]
now the type of v0
is Out
instead of AUTO_LOANS
so this solves nothing.
Any ideas how to preserve types or how to get them at compile time? I'm not quite sure if I can use Aux
for this. Any ideas?
scala type-conversion shapeless dependent-type downcasting
Here's code I have:
sealed trait Section {
val value:String
type Out
}
case object AUTO_LOANS extends Section{
val value="auto-loans"
type Out = AUTO_LOANS.type
}
case object STUDENT extends Section{
val value="student"
type Out = STUDENT.type
}
object Section {
def apply(s:String):Option[Section] = s match {
case "auto-loans" => Some(AUTO_LOANS)
case "student" => Some(STUDENT)
case _ =>None
}
}
and
sealed trait UserTypeFinder[A] {
def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User]
}
object UserTypeFinder {
def apply[A](implicit utf: UserTypeFinder[A]): UserTypeFinder[A]=utf
}
implicit val autoLoans = new UserTypeFinder[AUTO_LOANS.type] {
override def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User] = { .. }
}
def findUser[A: UserTypeFinder](section: A, fs: Set[Fact], fv: Option[FactVector]): Option[User] = {
UserTypeFinder[A].user(fs, fv)
}
now I do:
findUser(Section("auto-loans"),Set(),None)
the type of Section("auto-loans")
is Section
not AUTO_LOANS.
I'd like to preserve type for the type classes to work.
I've looked at shapeless dependent types so I was thinking of storing type Out in each case object (as seen above) then after getting the object casting it to Out:
val auto0=Section("auto-loans")
val v0=auto0.asInstanceOf[auto0.Out]
now the type of v0
is Out
instead of AUTO_LOANS
so this solves nothing.
Any ideas how to preserve types or how to get them at compile time? I'm not quite sure if I can use Aux
for this. Any ideas?
scala type-conversion shapeless dependent-type downcasting
scala type-conversion shapeless dependent-type downcasting
asked Nov 19 '18 at 21:30
AdrianAdrian
3,89073970
3,89073970
Possible duplicate of Function that retrieves element from HList (while preserving its type)
– Dmytro Mitin
Nov 20 '18 at 10:10
add a comment |
Possible duplicate of Function that retrieves element from HList (while preserving its type)
– Dmytro Mitin
Nov 20 '18 at 10:10
Possible duplicate of Function that retrieves element from HList (while preserving its type)
– Dmytro Mitin
Nov 20 '18 at 10:10
Possible duplicate of Function that retrieves element from HList (while preserving its type)
– Dmytro Mitin
Nov 20 '18 at 10:10
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53382926%2fuse-dependent-types-for-downcasting%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53382926%2fuse-dependent-types-for-downcasting%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Possible duplicate of Function that retrieves element from HList (while preserving its type)
– Dmytro Mitin
Nov 20 '18 at 10:10