Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add undefined to Prelude #44

Closed
cdepillabout opened this issue Nov 11, 2015 · 12 comments
Closed

add undefined to Prelude #44

cdepillabout opened this issue Nov 11, 2015 · 12 comments

Comments

@cdepillabout
Copy link
Contributor

When I'm programming in Haskell, I often use undefined to get code compiling when I am just fleshing out an api/type signatues.

For instance, when doing something like authentication, I might write the following code:

type Email = String
type Password = String
data AuthInfo = AuthInfo Email Password

auth :: AuthInfo -> Boolean
auth = undefined

checkEmail :: Email -> Boolean
checkEmail email = length Email >= 7 

checkEmailAndPassword :: Email -> Password -> Boolean
checkEmailAndPassword = undefined

At first, I don't want to worry about how to write the auth and checkEmailAndPassword functions, so I leave them as undefined. After making sure the types line up and code compiles, I take out the undefined, and fill in the appropriate code.

I end up wanting undefined so often that I think it should go into the Prelude.

However, there are some downsides to putting it into the prelude:

  • It makes the Prelude slightly bigger. It seems like most people want to keep the Prelude very small.
  • It isn't type safe. I don't think the current Prelude has any functions that will blow up at runtime? Except maybe unsafeCompare and division by 0.
@zudov
Copy link

zudov commented Nov 11, 2015

+1, I've been noticing myself doing different hacks like short-circuiting a function to get things compile, because of the lack of undefined and being lazy to import Unsafe.Coerce.

@garyb
Copy link
Member

garyb commented Nov 11, 2015

👎 for it being in the prelude, it's about the most unsafe function you can have so it definitely shouldn't be commonly imported - we try to avoid providing partial functions anywhere aside from Unsafe modules.

The only way I would be in favour of having this is if we included some kind of compiler hack so that there was an error thrown at the end of compilation if it was used, or for the generated runtime code to throw an error immediately (during initialisation) if the value is used.

@cdepillabout
Copy link
Contributor Author

👎 for it being in the prelude, it's about the most unsafe function you can have so it definitely shouldn't be commonly imported.

I mostly feel the same way. But undefined is just so convenient for "type-driven" programming, I feel like it should be somewhere easily accessable.

Maybe the best solution would just be to make my own Prelude.

@garyb
Copy link
Member

garyb commented Nov 11, 2015

Yeah, it's definitely super useful. I've written Unsafe.Coerce.unsafeCoerce unit so many times it's not even funny. I considered adding it to purescript-debug too, as at least that's not intended to appear in production code at all as a whole too.

Supporting it natively in the compiler is my preference really, not sure what @paf31 thinks about that though? Alas we probably can't use _ like in Haskell due to ambiguity with record wildcards.

@garyb
Copy link
Member

garyb commented Nov 11, 2015

Actually I guess _ is a little different as it throws an error immediately (I think?) when a hole is reached. Ideally it would compile everything and then error about using a hole at the end, that way you know the rest of the program compiles first.

@cdepillabout
Copy link
Contributor Author

Actually I guess _ is a little different as it throws an error immediately (I think?) when a hole is reached. Ideally it would compile everything and then error about using a hole at the end, that way you know the rest of the program compiles first.

Something that did this would be really nice.

Something along the same lines is that ghc flag that defers type errors to runtime.

@paf31
Copy link
Contributor

paf31 commented Nov 11, 2015

👎 I'd much rather this were supported in a custom prelude, or in the compiler as a variation on typed holes. In either case, strictness is going to be an issue.

@garyb
Copy link
Member

garyb commented Nov 11, 2015

In either case, strictness is going to be an issue.

How so? I think compilation should fail when a hole is present, just after all the other work is done so you know it would compile if the hole had an implementation.

@paf31
Copy link
Contributor

paf31 commented Nov 11, 2015

Ah, I was thinking it would be a warning like type wildcards (and ideally implemented using type wildcards).

@garyb
Copy link
Member

garyb commented Nov 11, 2015

Yeah, that's what I had in mind too - it desugars into something like (($hole :: forall a. a) :: _) but we take note if any of those desugarings happened, and if so we throw an error (or some kind of bail-out message) after typechecking has completed.

Even without the error it would be better than what we have now, but people don't necessarily always pay too much attention to warnings... especially when we have tons to fix in the core libraries. I get something like 400 warnings when building new-halogen slamdata 😆

@hdgarrood
Copy link
Contributor

So can we close this, if we've decided we'd rather do it inside the compiler? That is, purescript/purescript#1283

@paf31
Copy link
Contributor

paf31 commented Jan 7, 2016

Either way, I don't think it belongs in Prelude. A single-definition purescript-typed-holes library would be better IMO, or as you say, compiler support.

@paf31 paf31 closed this as completed Jan 7, 2016
JordanMartinez added a commit that referenced this issue Dec 24, 2020
* first commit

* Fix instances for record fields

* Break modules up

* Deriving Show (#5)

* Initial work on deriving Show

* Add test for Show

* Remove import

* Travis etc.

* Data.Generic.Rep.Bounded (#6)

* Data.Generic.Rep.Bounded

Generic implementations of Prelude.Bounded class's top and bottom.

* GenericBounded - don't support product types

* GenericBounded - only support NoArguments

* Update for PureScript 0.11

* Add Generic instance for Maybe (#9)

* Add missing Bounded instances for Argument

* Add GenericEnum and GenericBoundedEnum

* Add enum tests, convert existing "tests" into assertions

* Product instances in Bounded and Enum

* Added GenericShowFields instances for NoConstructors and NoArguments (#20)

* Added Eq and Show instances to NoArguments and NoConstructors

* Added GenericShowFields

* Removed Show, Eq

* Cleanup

* Removed NoConstructors Show instance

* Remove Rec and Field & update package & bower symbols

* Bump deps for compiler/0.12

* Remove symbols and fix operator fixity issue

* Update dependencies, license

* Added HeytingAlgebra, Semiring, Ring

* Fix type annotation precedence in tests

* Replace monomorphic proxies by Type.Proxy.Proxy (#44)

* Remove Generic Maybe instance

* Remove Generic Enum from src and test

* Move all files to their correct folders and rename files to Generic.purs

* Update module names to match their file names

* Move test file for Data.Generic.Rep into proper folder and rename

* Update generic-rep test file module to match file path

* Rename generic-rep test name to testGenericRep

* Replace generic Show's  Foldable.intercalate usage with FFI

* Replace Tuple with Pair in Data.Generic.Rep tests

* Remove Maybe import from Data.Generic.Rep test file

* Remove Maybe import from Data.Generic.Rep

* Extract AlmostEff and assert to Test.Utils.purs file

* Update Data.Generic.Rep tests to use AlmostEff; include it in main tests

* Import implies in Data.Generic.Rep tests

Co-authored-by: Phil Freeman <paf31@cantab.net>
Co-authored-by: Matthew Leon <ml@matthewleon.com>
Co-authored-by: Gary Burgess <gary.burgess@gmail.com>
Co-authored-by: Liam Goodacre <goodacre.liam@gmail.com>
Co-authored-by: Jorge Acereda <jacereda@gmail.com>
Co-authored-by: Kristoffer Josefsson <kejace@gmail.com>
Co-authored-by: Denis Stoyanov <stoyanov.gr@gmail.com>
Co-authored-by: Harry Garrood <harry@garrood.me>
Co-authored-by: Cyril <sobierajewicz.cyril@gmail.com>
turlando pushed a commit to purescm/purescript-prelude that referenced this issue Sep 3, 2021
* first commit

* Fix instances for record fields

* Break modules up

* Deriving Show (#5)

* Initial work on deriving Show

* Add test for Show

* Remove import

* Travis etc.

* Data.Generic.Rep.Bounded (#6)

* Data.Generic.Rep.Bounded

Generic implementations of Prelude.Bounded class's top and bottom.

* GenericBounded - don't support product types

* GenericBounded - only support NoArguments

* Update for PureScript 0.11

* Add Generic instance for Maybe (purescript#9)

* Add missing Bounded instances for Argument

* Add GenericEnum and GenericBoundedEnum

* Add enum tests, convert existing "tests" into assertions

* Product instances in Bounded and Enum

* Added GenericShowFields instances for NoConstructors and NoArguments (purescript#20)

* Added Eq and Show instances to NoArguments and NoConstructors

* Added GenericShowFields

* Removed Show, Eq

* Cleanup

* Removed NoConstructors Show instance

* Remove Rec and Field & update package & bower symbols

* Bump deps for compiler/0.12

* Remove symbols and fix operator fixity issue

* Update dependencies, license

* Added HeytingAlgebra, Semiring, Ring

* Fix type annotation precedence in tests

* Replace monomorphic proxies by Type.Proxy.Proxy (purescript#44)

* Remove Generic Maybe instance

* Remove Generic Enum from src and test

* Move all files to their correct folders and rename files to Generic.purs

* Update module names to match their file names

* Move test file for Data.Generic.Rep into proper folder and rename

* Update generic-rep test file module to match file path

* Rename generic-rep test name to testGenericRep

* Replace generic Show's  Foldable.intercalate usage with FFI

* Replace Tuple with Pair in Data.Generic.Rep tests

* Remove Maybe import from Data.Generic.Rep test file

* Remove Maybe import from Data.Generic.Rep

* Extract AlmostEff and assert to Test.Utils.purs file

* Update Data.Generic.Rep tests to use AlmostEff; include it in main tests

* Import implies in Data.Generic.Rep tests

Co-authored-by: Phil Freeman <paf31@cantab.net>
Co-authored-by: Matthew Leon <ml@matthewleon.com>
Co-authored-by: Gary Burgess <gary.burgess@gmail.com>
Co-authored-by: Liam Goodacre <goodacre.liam@gmail.com>
Co-authored-by: Jorge Acereda <jacereda@gmail.com>
Co-authored-by: Kristoffer Josefsson <kejace@gmail.com>
Co-authored-by: Denis Stoyanov <stoyanov.gr@gmail.com>
Co-authored-by: Harry Garrood <harry@garrood.me>
Co-authored-by: Cyril <sobierajewicz.cyril@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants