Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6842181
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T00:04:05+00:00 2026-05-27T00:04:05+00:00

I saw this snippet at the devlog of omegagb : data ExecutionAST result where

  • 0

I saw this snippet at the devlog of omegagb:

data ExecutionAST result where
  Return :: result -> ExecutionAST result
  Bind :: (ExecutionAST oldres) -> (oldres -> ExecutionAST result) ->
          ExecutionAST result
  WriteRegister :: M_Register -> Word8 -> ExecutionAST ()
  ReadRegister :: M_Register -> ExecutionAST Word8
  WriteRegister2 :: M_Register2 -> Word16 -> ExecutionAST ()
  ReadRegister2 :: M_Register2 -> ExecutionAST Word16
  WriteMemory :: Word16 -> Word8 -> ExecutionAST ()
  ReadMemory :: Word16 -> ExecutionAST Word8

What does the data ... where mean? I thought the keyword data is used to define a new type.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T00:04:06+00:00Added an answer on May 27, 2026 at 12:04 am

    It defines a new type, the syntax is called generalized algebraic data type.

    It is more general than the normal syntax. You can write any normal type definition (ADT) using GADTs:

    data E a = A a | B Integer
    

    can be written as:

    data E a where
      A :: a -> E a
      B :: Integer -> E a
    

    But you can also restrict what is on right hand side:

    data E a where
      A :: a -> E a
      B :: Integer -> E a
      C :: Bool -> E Bool
    

    which is not possible with a normal ADT declaration.

    For more, check Haskell wiki or this video.


    The reason is type safety. ExecutionAST t is supposed to be type of statements returning t. If you write a normal ADT

    data ExecutionAST result = Return result 
                             | WriteRegister M_Register Word8
                             | ReadRegister M_Register
                             | ReadMemory Word16
                             | WriteMemory Word16
                             | ...
    

    then ReadMemory 5 will be a polymorphic value of type ExecutionAST t, instead of monomorphic ExecutionAST Word8, and this will type check:

    x :: M_Register2
    x = ...
    
    a = Bind (ReadMemory 1) (WriteRegister2 x)
    

    That statement should read memory from location 1 and write to register x. However, reading from memory gives 8-bit words, and writing to x requires 16-bit words. By using a GADT, you can be sure this won’t compile. Compile-time errors are better than run-time errors.

    GADTs also include existential types. If you tried to write bind this way:

    data ExecutionAST result = ... 
                               | Bind (ExecutionAST oldres)
                                      (oldres -> ExecutionAST result)
    

    then it won’t compile since “oldres” is not in scope, you have to write:

    data ExecutionAST result = ...
                               | forall oldres. Bind (ExecutionAST oldres)
                                                     (oldres -> ExecutionAST result)
    

    If you are confused, check the linked video for simpler, related example.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I saw this code snippet during our lab and it actually compiles in MSVC2008
I saw this code snippet const volatile int * volatile * const X; but
I'm new to ruby, and I saw this code snippet 1|2 and it returns
Again, I saw this sentence: A .classpath file snippet that can be included in
I saw this code snippet which talks about how to group socket connections from
I saw this code snippet: $(ul li).text().search(new RegExp(sometext, i)); and wanted to know if
This morning I accidentally saw the following snippet code, I was fairly surprised because
I saw this Java snippet in the book Spring in Action , but I'm
I saw somewhere this code snippet: var idx = SOME_VALUE; var color = {
I saw somewhere the code snippet: list.forEach(callback, this); I understand ' forEach ' loop

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.