Use dependent types for downcasting?












0















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?










share|improve this question























  • Possible duplicate of Function that retrieves element from HList (while preserving its type)

    – Dmytro Mitin
    Nov 20 '18 at 10:10
















0















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?










share|improve this question























  • Possible duplicate of Function that retrieves element from HList (while preserving its type)

    – Dmytro Mitin
    Nov 20 '18 at 10:10














0












0








0


1






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?










share|improve this question














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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










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



















  • 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












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
});


}
});














draft saved

draft discarded


















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
















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

How to change which sound is reproduced for terminal bell?

Can I use Tabulator js library in my java Spring + Thymeleaf project?

Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents