https://wiki.haskell.org/api.php?action=feedcontributions&user=Ashley+Y&feedformat=atomHaskellWiki - User contributions [en]2015-08-31T09:20:50ZUser contributionsMediaWiki 1.19.14+dfsg-1https://wiki.haskell.org/Library_submissionsLibrary submissions2013-06-24T08:20:16Z<p>Ashley Y: /* The Core Libraries */ time is a core library</p>
<hr />
<div>This page describes the process for maintaining the <br />
'''Core libraries'''. The core libraries are a subset of the packages in the<br />
Haskell Platform, and define basic APIs that are expected to be<br />
available in any Haskell implementation. They are listed under "The Core Libraries" below.<br />
<br />
Non-core libraries are, of course, managed by their own authors/maintainers (named in their .cabal file), using whatever policies those maintainers see fit. [Note: arguably the policies below might usefully be applied to all libraries embodied in the Haskell Platform, but that is a question for the HP team.]<br />
<br />
= General principles =<br />
<br />
* Each core package has a named maintainer, or small group of maintainers, who have commit access to the package. <br />
<br />
* Third parties are encouraged to make proposals for changes, both to the library API and its implementation, by sending the proposal to the maintainer (CC'ing the libraries mailing list).<br />
<br />
* The maintainer is trusted to decide what changes to make to the package, and when. They are strongly encouraged to follow the guidance below, but the general principle is: the community offers opinions, but the maintainers decide.<br />
<br />
<br />
= Responsiveness =<br />
<br />
* Third parties submitting proposals to the maintainer of a library can expect a timely and thoughtful response. <br />
* The more effort the proposer invests (for example, by constructing a patch rather than making an off-the-cuff suggestion) the more consideration s/he can reasonably expect.<br />
* Proposals that have widespread support, and are accompanied by patches (preferably with tests and documentation), should normally be accepted by the maintainer. <br />
* It is up to the maintainer to decide what "widespread" means; in particular, it does not always mean "a majority of those who responded". The majority-responder story is vulnerable to selection bias; e.g. 7 people (out of a client base of hundreds) say "add this function" but the maintainer thinks it will make the interface incrementally more complicated without sufficient benefit.<br />
* Where there is significant work involved in implementing a proposal, it is reasonable for a maintainer to ask for a patch. The principle is that maintainers are not obliged to do the work of implementing a proposal, even if it does enjoy wide support. For more substantial changes, it makes sense to develop the implementation in dialogue with the maintainer.<br />
<br />
= Guidance for proposers =<br />
<br />
A "proposal" can be anything from a one-sentence suggestion to a fully-implemented, tested, and documented patch.<br />
However, the more substantial the proposal the more attention you can expect. The process is this:<br />
<br />
* Send your proposal by email to the maintainer, with a copy to the libraries@haskell.org mailing list (which you need to [http://www.haskell.org/mailman/listinfo/libraries subscribe] to before posting).<br />
<br />
* Set a deadline for discussion (no less than two weeks), and act as chair/moderator for the discussion. <br />
<br />
* At the end of the discussion period, summarise your understanding of the consensus (or lack thereof), including a link to the thread in the mailing list archives, and send the summary to the maintainer for decision. The deadline gives you a moment to summarise the debate and hand over to the maintainer. It isn't a deadline for the maintainer to decide; for example he or she may seek more discussion first. <br />
<br />
* If the decision is positive, [http://hackage.haskell.org/trac/ghc/newticket create a ticket] on the GHC trac. The description of the ticket can summarise the proposal and link to the mail thread. Further discussion and implementation patches can be attached to the ticket, and the ticket helps the maintainer to keep track of what is on the go. (Obviously if the maintainer prefers some other mechanism, follow his or her guidance.)<br />
<br />
* For non-trivial changes the maintainer may ask for a patch. You may create the patch up front, and make it part of your proposal; or you may want to have some discussion about the design first, and only then roll up your sleeves to do the implementation; and for bigger jobs you may want to wait until the maintainer agrees in principle with the change.<br />
<br />
Here are desirable properties for a proposal and its implementation. The more of these properties your proposal or patch has, the more likely it is that the maintainer will adopt your idea. After all, to adopt it the maintainter will have to do whatever tasks you didn't do.<br />
<br />
* '''Description'''. A good proposal says clearly ''what'' you propose, ''why'' it is a good idea, and what its consequences would be.<br />
* '''Patch'''. Use <tt>darcs record</tt> or <tt>git commit</tt> (depending on what sort of repo the library lives in) to create it. Save the patch to a file, using <tt>darcs send --output</tt> or <tt>git format-patch</tt>. Make your changes against a copy of the master branch of the relevant library, and make sure it compiles.<br />
* '''Portability'''. Good code is portable. In particular, try to ensure the code runs in Hugs and GHC, and on Windows and Linux.<br />
* '''Style'''. Good code follows the conventions in the library you are modifying.<br />
* '''Documentation'''. Good code includes valid [http://haskell.org/haddock Haddock] documentation.<br />
* '''Tests'''. Good patches have suitable tests for the library's testsuite.<br />
<br />
= Guidance for maintainers =<br />
<br />
The principle is that we '''trust the maintainer''' to behave sensibly. The guidelines below are just that: guidelines, not rules. Still, the core libraries are used by many, many people, so maintainers should make every effort not to mess them up by accident. <br />
<br />
* '''API changes should be discussed''' on the libraries mailing list prior to making the change, even if the maintainer is the proposer. The maintainer still has ultimate say in what changes are made, but the community should have the opportunity to comment on changes. However, unanimity (or even a majority) is not required.<br />
<br />
* '''Every API change should be described precisely in the commit log.''' The commit logs should be sent to a public mailing list, or otherwise made easily available (e.g. via github), so that the community can keep an eye on changes and comment.<br />
<br />
* '''Backwards compatibility''' is important to many users. API changes are expected to retain backwards compatibility wherever possible. However, from time to time we may decide to have major revisions which are explicitly not backwards compatible; in these cases we may try to make the previous version of the package available concurrently, as in the base-3/base-4 switchover.<br />
<br />
* You don't need to consult the community for '''purely internal changes'''; i.e. changes that do not affect the library's clients.<br />
<br />
* Changes that simply '''widen the API by adding new functions''' are a bit of a grey area. It's better to consult the community, because there may be useful feedback about (say) the order of arguments, or the name of the function, or whatnot. On the other hand few clients will actually break if you add a new function to the API. Use your judgment.<br />
<br />
Libraries maintained by the GHC team are subject to the GHC validation policy - patches will be tested for validation before committing ([http://hackage.haskell.org/trac/ghc/wiki/TestingPatches TestingPatches]). Those packages not maintained by the GHC team will probably have a GHC lagging mirror repository that is subject to validation.<br />
<br />
= The Core Libraries =<br />
<br />
The following packages constitute the core libraries:<br />
<br />
{| border="1"<br />
! Package !! Maintainer<br />
|-<br />
| [http://hackage.haskell.org/package/array array] || Core Libraries Committee<br />
|-<br />
| [http://hackage.haskell.org/package/base base] || Core Libraries Committee<br />
|-<br />
| [http://hackage.haskell.org/package/containers containers] || Johan Tibell and Milan Straka<br />
|-<br />
| [http://hackage.haskell.org/package/deepseq deepseq] || Simon Marlow<br />
|-<br />
| [http://hackage.haskell.org/package/directory directory] || Core Libraries Committee<br />
|-<br />
| [http://hackage.haskell.org/package/extensible-exceptions extensible-exceptions] || Core Libraries Committee <br />
|-<br />
| [http://hackage.haskell.org/package/ghc-prim ghc-prim] || GHC HQ<br />
|-<br />
| [http://hackage.haskell.org/package/hpc hpc] || Andy Gill <br />
|-<br />
| [http://hackage.haskell.org/package/mtl mtl] || Edward Kmett<br />
|-<br />
| [http://hackage.haskell.org/package/parallel parallel] || Simon Marlow<br />
|-<br />
| [http://hackage.haskell.org/package/pretty pretty] || David Terei<br />
|-<br />
| [http://hackage.haskell.org/package/process process] || Core Libraries Committee <br />
|-<br />
| [http://hackage.haskell.org/package/random random] || Ryan Newton<br />
|-<br />
| [http://hackage.haskell.org/package/template-haskell template-haskell] || Core Libraries Committee<br />
|-<br />
| [http://hackage.haskell.org/package/time time] || Ashley Yakeley<br />
|-<br />
| [http://hackage.haskell.org/package/unix unix] || Core Libraries Committee<br />
|-<br />
| [http://hackage.haskell.org/package/Win32 Win32] || Bryan O'Sullivan<br />
|-<br />
| [http://hackage.haskell.org/package/xhtml xhtml] || Chris Dornan<br />
|}<br />
<br />
The maintainer "GHC HQ" means Simon Marlow, Simon Peyton Jones, and Ian Lynagh. Daniel Fischer has taken responsibility for numeric stuff. Email ghc-devs@haskell.org<br />
<br />
The "Core Libraries Committee" was formed to provide a maintainer of many of the packages previously managed by GHC HQ and can be reached by emailing core-libraries-committee@haskell.org<br />
<br />
The following packages match the appropriate language standard, and as such cannot change independently. The code is maintained by the GHC team.<br />
<br />
{| border="1"<br />
|-<br />
| [http://hackage.haskell.org/package/haskell2010 haskell2010] || GHC HQ<br />
|-<br />
| [http://hackage.haskell.org/package/haskell98 haskell98] || GHC HQ<br />
|}<br />
<br />
These packages are maintained only for backward compatibility, and are not expected to undergo API changes in the future. <br />
<br />
{| border="1"<br />
|-<br />
| [http://hackage.haskell.org/package/old-locale old-locale] || Core Libraries Committee <br />
|-<br />
| [http://hackage.haskell.org/package/old-time old-time] || Core Libraries Committee <br />
|}<br />
<br />
= See also =<br />
<br />
* [http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions GHC Working Conventions], including guidelines for submitting patches via darcs.<br />
* [http://haskell.org/haskellwiki/Category:Style Notes on programming style]<br />
<br />
[[Category:Community]]<br />
[[Category:Proposals| ]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-09-06T04:54:25Z<p>Ashley Y: /* Hask is not Cartesian closed */</p>
<hr />
<div>'''Hask''' is the [[Category theory|category]] of Haskell types and functions.<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Type<br />
| <hask>data Empty</hask><br />
| <hask>data () = ()</hask><br />
| <hask>data Either a b<br />
= Left a | Right b</hask><br />
| <hask>data (a,b) =<br />
(,) { fst :: a, snd :: b}</hask><br />
| <hask>data P a b =<br />
P {fstP :: !a, sndP :: !b}</hask><br />
|-<br />
! scope="row" | Requirement<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> P a b</hask><br />
<br />
such that:<br />
<hask>fstP . u = f</hask><br />
<br /><hask>sndP . u = g</hask><br />
|-<br />
! scope="row" | Candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
| <hask>u1 r = P (f r) (g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|<br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>f _ = ()</hask><br />
<br /><hask>(fstP . u1) _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products, and instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-09-06T04:53:04Z<p>Ashley Y: /* "Platonic" Hask */</p>
<hr />
<div>'''Hask''' is the [[Category theory|category]] of Haskell types and functions.<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Type<br />
| <hask>data Empty</hask><br />
| <hask>data () = ()</hask><br />
| <hask>data Either a b<br />
= Left a | Right b</hask><br />
| <hask>data (a,b) =<br />
(,) { fst :: a, snd :: b}</hask><br />
| <hask>data P a b =<br />
P {fstP :: !a, sndP :: !b}</hask><br />
|-<br />
! scope="row" | Requirement<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> P a b</hask><br />
<br />
such that:<br />
<hask>fstP . u = f</hask><br />
<br /><hask>sndP . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
| <hask>u1 r = P (f r) (g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|<br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>f _ = ()</hask><br />
<br /><hask>(fstP . u1) _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products, and instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-09-06T04:50:38Z<p>Ashley Y: /* Hask is not Cartesian closed */</p>
<hr />
<div>'''Hask''' is the [[Category theory|category]] of Haskell types and functions.<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Type<br />
| <hask>data Empty</hask><br />
| <hask>data () = ()</hask><br />
| <hask>data Either a b<br />
= Left a | Right b</hask><br />
| <hask>data (a,b) =<br />
(,) { fst :: a, snd :: b}</hask><br />
| <hask>data P a b =<br />
P {fstP :: !a, sndP :: !b}</hask><br />
|-<br />
! scope="row" | Requirement<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> P a b</hask><br />
<br />
such that:<br />
<hask>fstP . u = f</hask><br />
<br /><hask>sndP . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
| <hask>u1 r = P (f r) (g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|<br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>f _ = ()</hask><br />
<br /><hask>(fstP . u1) _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-09-06T04:50:03Z<p>Ashley Y: </p>
<hr />
<div>'''Hask''' is the [[Category theory|category]] of Haskell types and functions.<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Type<br />
| <hask>data Empty</hask><br />
| <hask>data () = ()</hask><br />
| <hask>data Either a b<br />
= Left a | Right b</hask><br />
| <hask>data (a,b) =<br />
(,) { fst :: a, snd :: b}</hask><br />
| <hask>data P a b =<br />
P {fstP :: !a, sndP :: !b}</hask><br />
|-<br />
! scope="row" | Requirement<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> P a b</hask><br />
<br />
such that:<br />
<hask>fstP . u = f</hask><br />
<br /><hask>sndP . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
| <hask>u1 r = P (f r) (g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = ()</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|<br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>g _ = ()</hask><br />
<br /><hask>(fstP . u1) _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-09-06T04:46:46Z<p>Ashley Y: /* Hask is not Cartesian closed */</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== Definition ==<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Type<br />
| <hask>data Empty</hask><br />
| <hask>data () = ()</hask><br />
| <hask>data Either a b<br />
= Left a | Right b</hask><br />
| <hask>data (a,b) =<br />
(,) { fst :: a, snd :: b}</hask><br />
| <hask>data P a b =<br />
P {fstP :: !a, sndP :: !b}</hask><br />
|-<br />
! scope="row" | Requirement<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> P a b</hask><br />
<br />
such that:<br />
<hask>fstP . u = f</hask><br />
<br /><hask>sndP . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
| <hask>u1 r = P (f r) (g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = ()</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|<br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>g _ = ()</hask><br />
<br /><hask>(fstP . u1) _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-09-06T04:39:47Z<p>Ashley Y: /* Hask is not Cartesian closed */ strict product</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== Definition ==<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Type<br />
| <hask>data Empty</hask><br />
| <hask>data () = ()</hask><br />
| <hask>data Either a b<br />
= Left a | Right b</hask><br />
| <hask>data (a,b) = (,) a b</hask><br />
| <hask>data P a b = P !a !b</hask><br />
|-<br />
! scope="row" | Requirement<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> P a b</hask><br />
<br />
such that:<br />
<hask>fstP . u = f</hask><br />
<br /><hask>sndP . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
| <hask>u1 r = P (f r) (g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = ()</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|<br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>g _ = ()</hask><br />
<br /><hask>(fstP . u1) _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-23T07:31:04Z<p>Ashley Y: /* "Platonic" Hask */</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== Definition ==<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottom values. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-23T07:26:01Z<p>Ashley Y: </p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== Definition ==<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
== Is '''Hask''' even a category? ==<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
== '''Hask''' is not Cartesian closed ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== "Platonic" '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/Category_theoryCategory theory2012-08-22T08:07:29Z<p>Ashley Y: </p>
<hr />
<div>{{Foundations infobox}}<br />
'''Category theory''' can be helpful in understanding Haskell's type system. There exists a [[Hask|"Haskell category"]], of which the objects are Haskell types, and the morphisms from types <hask>a</hask> to <hask>b</hask> are Haskell functions of type <hask>a -> b</hask>.<br />
<br />
__TOC__<br />
<br />
The Haskell wikibooks has [http://en.wikibooks.org/wiki/Haskell/Category_theory an introduction to Category theory], written specifically with Haskell programmers in mind.<br />
<br />
==Definition of a category==<br />
<br />
<br />
A category <math>\mathcal{C}</math>consists of two collections:<br />
<br />
Ob<math>(\mathcal{C})</math>, the objects of <math>\mathcal{C}</math><br />
<br />
Ar<math>(\mathcal{C})</math>, the arrows of <math>\mathcal{C}</math><br />
(which are not the same as [[Arrow]]s defined in [[GHC]])<br />
<br />
Each arrow <math>f</math> in Ar<math>(\mathcal{C})</math> has a<br />
domain, dom <math>f</math>, and a codomain, cod <math>f</math>, each<br />
chosen from Ob<math>(\mathcal{C})</math>. The notation <math>f\colon<br />
A \to B</math> means <math>f</math> is an arrow with domain<br />
<math>A</math> and codomain <math>B</math>. Further, there is a<br />
function <math>\circ</math> called composition, such that <math>g<br />
\circ f</math> is defined only when the codomain of <math>f</math> is<br />
the domain of <math>g</math>, and in this case, <math>g \circ f</math><br />
has the domain of <math>f</math> and the codomain of <math>g</math>. <br />
<br />
In symbols, if <math>f\colon A \to B</math> and <math>g\colon B \to<br />
C</math>, then <math>g \circ f \colon A \to C</math>. <br />
<br />
Also, for each object <math>A</math>, there is an arrow<br />
<math>\mathrm{id}_A\colon A \to A</math>, (often simply denoted as<br />
<math>1</math> or <math>\mathrm{id}</math>, when there is no chance of<br />
confusion). <br />
<br />
===Axioms===<br />
The following axioms must hold for <math>\mathcal{C}</math> to be a category:<br />
<br />
#If <math>f\colon A \to B</math> then <math>f \circ \mathrm{id}_A = \mathrm{id}_B\circ f = f</math> (left and right identity) <br />
#If <math>f\colon A \to B</math> and <math>g \colon B \to C</math> and <math>h \colon C \to D</math>, then <math>h \circ (g \circ f) = (h<br />
\circ g) \circ f</math> (associativity) <br />
<br />
===Examples of categories===<br />
* Set, the category of sets and set functions.<br />
* Mon, the category of monoids and monoid morphisms.<br />
* Monoids are themselves one-object categories.<br />
* Grp, the category of groups and group morphisms.<br />
* Rng, the category of rings and ring morphisms.<br />
* Grph, the category of graphs and graph morphisms.<br />
* Top, the category of topological spaces and continuous maps.<br />
* Preord, the category of preorders and order preserving maps.<br />
* CPO, the category of complete partial orders and continuous functions.<br />
* Cat, the category of categories and functors.<br />
<br />
* [[Hask]]<br />
* the category of data types and functions on data structures <br />
* the category of functions and data flows (~ data flow diagram)<br />
* the category of stateful objects and dependencies (~ object diagram)<br />
* the category of values and value constructors<br />
* the category of states and messages (~ state diagram)<br />
<br />
===Further definitions===<br />
With examples in Haskell at:<br />
* [[Category theory/Functor]]<br />
* [[Category theory/Natural transformation]]<br />
* [[Category theory/Monads]]<br />
<br />
== Categorical programming ==<br />
<br />
Catamorphisms and related concepts, categorical approach to functional programming, categorical programming. Many materials cited here refer to category theory, so as an introduction to this discipline see the [[#See also]] section.<br />
* Erik Meijer, Maarten Fokkinga, Ross Paterson: [http://research.microsoft.com/en-us/um/people/emeijer/Papers/fpca91.pdf Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire]. See also related documents (in the CiteSeer page). Understanding the article does not require knowledge of category theory—the paper is self-contained with regard to understanding catamorphisms, anamorphisms and other related concepts.<br />
* Roland Backhouse, Patrik Jansson, Johan Jeuring and Lambert Mertens. [http://www.cse.chalmers.se/~patrikj/poly/afp98/ Generic Programming - an Introduction]: Detailed introduction to categorial sums, product, polynomial functors and folds for the purpose of generic programming. Supplements the bananas paper.<br />
* Varmo Vene and Tarmo Uustalu: [http://citeseer.ist.psu.edu/vene98functional.html Functional Programming with Apomorphisms / Corecursion]<br />
* Varmo Vene: [http://www.cs.ut.ee/~varmo/papers/thesis.pdf Categorical Programming with Inductive and Coinductive Types]. The book gives Haskell examples to illustrate the deep categorical theory topic.<br />
* Tatsuya Hagino: [http://www.tom.sfc.keio.ac.jp/~hagino/thesis.pdf A Categorical Programming Language]<br />
* [http://pll.cpsc.ucalgary.ca/charity1/www/home.html Charity], a categorical programming language implementation.<br />
* [http://okmij.org/ftp/Haskell/categorical-maxn.lhs Deeply uncurried products, as categorists might like them] article mentions a conjecture: relatedness to [[Combinatory logic]]<br />
<br />
==Haskell libraries and tools==<br />
<br />
* [http://www.eyrie.org/~zednenem/2004/hsce/ Category extras] by [http://www.eyrie.org/~zednenem/about/dave.html David Menendez]: libraries for e.g. comonads, infinite data types.<br />
<br />
==Books==<br />
<br />
*Michael Barr and Charles Wells: [http://www.cwru.edu/artsci/math/wells/pub/ttt.html Toposes, Triples and Theories]. The online, freely available book is both an introductory and a detailed description of category theory. It also contains a category-theoretical description of the concept of ''monad'' (but calling it a ''triple'' instead of ''monad'').<br />
<br />
*R. F. C. Walters: [http://www.cambridge.org/us/catalogue/catalogue.asp?isbn=0521419972 Categories and Computer Science]. Category Theory has, in recent years, become increasingly important and popular in computer science, and many universities now introduce Category Theory as part of the curriculum for undergraduate computer science students. Here, the theory is developed in a straightforward way, and is enriched with many examples from computer science.<br />
<br />
* Arbib&Manes: Arrow, Structures and Functors - The Categorical Imperative. (c)1975 Academic Press, ISBN 0-12-059060-3. Sadly now out of print but very little prerequisite knowledge is needed. It covers monads and the Yoneda lemma.<br />
<br />
==See also==<br />
<br />
* Michael Barr and Charles Wells have a [http://www.math.upatras.gr/~cdrossos/Docs/B-W-LectureNotes.pdf paper] that presents category theory from a computer-science perspective, assuming no prior knowledge of categories.<br />
*[http://wwwhome.cs.utwente.nl/~fokkinga/mmf92b.html A Gentle Introduction to Category Theory - the calculational approach] written by [http://wwwhome.cs.utwente.nl/~fokkinga/index.html Maarten M Fokkinga].<br />
* Wikipedia has a good [http://en.wikipedia.org/wiki/List_of_category_theory_topics collection of category-theory articles], although, as is typical of Wikipedia articles, they are rather dense.<br />
<br />
[[Category:Theoretical foundations]]<br />
[[Category:Mathematics]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-22T07:59:02Z<p>Ashley Y: /* Hask */</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g = \x -> f (g x)</hask>.<br />
<br />
=== Is '''Hask''' even a category? ===<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f x = g x</hask> for all <hask>x</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
=== '''Hask''' is not Cartesian closed ===<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-22T07:56:19Z<p>Ashley Y: /* Hask */</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
The objects of '''Hask''' are Haskell types, and the morphisms from objects <hask>A</hask> to <hask>B</hask> are Haskell functions of type <hask>A -> B</hask>. The identity morphism for object <hask>A</hask> is <hask>id :: A</hask>, and the composition of morphisms <hask>f</hask> and <hask>g</hask> is <hask>f . g</hask>.<br />
<br />
=== Is '''Hask''' even a category? ===<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f a = g a</hask> for all <hask>a</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
=== '''Hask''' is not Cartesian closed ===<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-22T07:51:01Z<p>Ashley Y: </p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
=== Is '''Hask''' even a category? ===<br />
<br />
Consider:<br />
<br />
<haskell><br />
undef1 = undefined :: a -> b<br />
undef2 = \_ -> undefined<br />
</haskell><br />
<br />
Note that these are not the same value:<br />
<br />
<haskell><br />
seq undef1 () = undefined<br />
seq undef2 () = ()<br />
</haskell><br />
<br />
This might be a problem, because <hask>undef1 . id = undef2</hask>. In order to make '''Hask''' a category, we define two functions <hask>f</hask> and <hask>g</hask> as the same morphism if <hask>f a = g a</hask> for all <hask>a</hask>. Thus <hask>undef1</hask> and <hask>undef2</hask> are different ''values'', but the same ''morphism'' in '''Hask'''.<br />
<br />
=== '''Hask''' is not Cartesian closed ===<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-17T18:29:29Z<p>Ashley Y: /* Hask */</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-17T18:26:40Z<p>Ashley Y: /* Hask */ stretch out table</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<br /><hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<br /><hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<br /><hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<br /><hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-17T18:19:06Z<p>Ashley Y: </p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<br /><hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<br /><hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<br /><hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<br /><hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<br /><hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-08T05:59:50Z<p>Ashley Y: /* Hask */ newlines</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<br /><hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<br /><hask>u :: r -> ()</hask><br />
| For any functions<br />
<br /><hask>f :: a -> r</hask><br />
<br /><hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<br /><hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<br /><hask>u . Left = f</hask><br />
<br /><hask>u . Right = g</hask><br />
| For any functions<br />
<br /><hask>f :: r -> a</hask><br />
<br /><hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<br /><hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<br /><hask>fst . u = f</hask><br />
<br /><hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = ()</hask><br />
<br /><hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<br /><hask>f _ = undefined</hask><br />
<br /><hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<br /><hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<br /><hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-07T10:38:24Z<p>Ashley Y: </p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in. There is a faithful functor from platonic '''Hask''' to actual '''Hask''' allowing programmers to think in the former to write code in the latter.<br />
<br />
== '''Hask''' ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<hask>u :: r -> ()</hask><br />
| For any functions<br />
<hask>f :: a -> r</hask><br />
<hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<hask>u . Right = g</hask><br />
| For any functions<br />
<hask>f :: r -> a</hask><br />
<hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<hask>f _ = ()</hask><br />
<hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<hask>f _ = undefined</hask><br />
<hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-07T10:24:21Z<p>Ashley Y: </p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual '''Hask'''''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic '''Hask'''''). The reason for this is that platonic '''Hask''' has lots of nice properties that actual '''Hask''' does not, and is thus easier to reason in.<br />
<br />
== '''Hask''' ==<br />
<br />
Actual '''Hask''' does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<hask>u :: r -> ()</hask><br />
| For any functions<br />
<hask>f :: a -> r</hask><br />
<hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<hask>u . Right = g</hask><br />
| For any functions<br />
<hask>f :: r -> a</hask><br />
<hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<hask>f _ = ()</hask><br />
<hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<hask>f _ = undefined</hask><br />
<hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad really are endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/HaskHask2012-08-07T10:23:01Z<p>Ashley Y: Rewrite</p>
<hr />
<div>'''Hask''' refers to a [[Category theory|category]] with types as objects and functions between them as morphisms. However, its use is ambiguous. Sometimes it refers to Haskell (''actual Hask''), and sometimes it refers to some subset of Haskell where no values are bottom and all functions terminate (''platonic Hask''). The reason for this is that platonic Hask has lots of nice properties that actual Hask does not, and is thus easier to reason in.<br />
<br />
== Hask ==<br />
<br />
Actual Hask does not have sums, products, or an initial object, and <hask>()</hask> is not a terminal object. The Monad identities fail for almost all instances of the Monad class.<br />
<br />
{| class="wikitable"<br />
|+ Why '''Hask''' isn't as nice as you'd thought.<br />
! scope="col" |<br />
! scope="col" | Initial Object<br />
! scope="col" | Terminal Object<br />
! scope="col" | Sum<br />
! scope="col" | Product<br />
|-<br />
! scope="row" | Definition<br />
| There is a unique function<br />
<hask>u :: Empty -> r</hask><br />
| There is a unique function<br />
<hask>u :: r -> ()</hask><br />
| For any functions<br />
<hask>f :: a -> r</hask><br />
<hask>g :: b -> r</hask><br />
<br />
there is a unique function<br />
<hask>u :: Either a b -> r</hask><br />
<br />
such that:<br />
<hask>u . Left = f</hask><br />
<hask>u . Right = g</hask><br />
| For any functions<br />
<hask>f :: r -> a</hask><br />
<hask>g :: r -> b</hask><br />
<br />
there is a unique function<br />
<hask>u :: r -> (a,b)</hask><br />
<br />
such that:<br />
<hask>fst . u = f</hask><br />
<hask>snd . u = g</hask><br />
|-<br />
! scope="row" | Platonic candidate<br />
| <hask>u1 r = case r of {}</hask><br />
| <hask>u1 _ = ()</hask><br />
| <hask>u1 (Left a) = f a</hask><br />
<hask>u1 (Right b) = g b</hask><br />
| <hask>u1 r = (f r,g r)</hask><br />
|-<br />
! scope="row" | Example failure condition<br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
| <hask>r ~ ()</hask><br />
<hask>f _ = ()</hask><br />
<hask>g _ = ()</hask><br />
| <hask>r ~ ()</hask><br />
<hask>f _ = undefined</hask><br />
<hask>g _ = undefined</hask><br />
|-<br />
! scope="row" | Alternative u<br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
| <hask>u2 _ = ()</hask><br />
| <hask>u2 _ = undefined</hask><br />
|-<br />
! scope="row" | Difference<br />
| <hask>u1 undefined = undefined</hask><br />
<hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = ()</hask><br />
<hask>u2 _ = undefined</hask><br />
| <hask>u1 undefined = undefined</hask><br />
<hask>u2 undefined = ()</hask><br />
| <hask>u1 _ = (undefined,undefined)</hask><br />
<hask>u2 _ = undefined</hask><br />
|- style="background: red;"<br />
! scope="row" | Result<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
! scope="col" | FAIL<br />
|}<br />
<br />
== Platonic '''Hask''' ==<br />
<br />
Because of these difficulties, Haskell developers tend to think in some subset of Haskell where types do not have bottoms. This means that it only includes functions that terminate, and typically only finite values. The corresponding category has the expected initial and terminal objects, sums and products. Instances of Functor and Monad are really endofunctors and monads.<br />
<br />
== Links ==<br />
<br />
* [http://www.cs.gunma-u.ac.jp/~hamana/Papers/cpo.pdf Makoto Hamana: ''What is the category for Haskell?'']<br />
* [http://www.cs.nott.ac.uk/~nad/publications/danielsson-popl2006-tr.pdf Nils A. Danielsson, John Hughes, Patrik Jansson, and Jeremy Gibbons. ''Fast and loose reasoning is morally correct.'']<br />
<br />
[[Category:Mathematics]]<br />
[[Category:Theoretical foundations]]</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2012-01-30T01:55:26Z<p>Ashley Y: /* Steady spam = */</p>
<hr />
<div>Please also email me after putting something on this page. &mdash;[[User:Ashley Y|Ashley Y]] 02:49, 26 January 2012 (UTC)<br />
<br />
== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
----<br />
<br />
Block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=HelenGarcia please. --[[User:Gwern|Gwern]] 01:09, 9 April 2010 (UTC)<br />
<br />
:And [[User:Carolin]]. --[[User:Gwern|Gwern]] 01:12, 9 April 2010 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)<br />
<br />
::Well, we were pretty fine for the last couple months, but then a few dozen/hundred spam accounts got registered...<br />
::It seems to me we need an active admin. I nominate myself. The discussion on -cafe about new admins [http://www.mail-archive.com/haskell-cafe@haskell.org/msg60954.html petered out] last time (Peterson never replied to me), but now it's a little more urgent. --[[User:Gwern|Gwern]] 01:21, 12 July 2010 (UTC)<br />
<br />
:::We're in the process of moving to a new server running Debian and MediaWiki 1.12. &mdash;[[User:Ashley Y|Ashley Y]] 01:44, 12 July 2010 (UTC)<br />
<br />
::::Which will no doubt help. But spammers won't block themselves. --[[User:Gwern|Gwern]] 03:43, 12 July 2010 (UTC)<br />
<br />
:::::I think MediaWiki 1.12 has some extensions that will help. &mdash;[[User:Ashley Y|Ashley Y]] 03:58, 12 July 2010 (UTC)<br />
<br />
:What's the process for approving people to be admin? Should I ping the Cafe list about it? &mdash;[[User:Ashley Y|Ashley Y]] 17:36, 12 July 2010 (UTC)<br />
<br />
::I don't think there is any process. I linked an email in which I suggested several people for adminship (including myself), and no one objected to any of my choices, which is pretty much how the English Wikipedia did things in the early days. --[[User:Gwern|Gwern]] 00:27, 13 July 2010 (UTC)<br />
<br />
=== Steady spam ====<br />
<br />
Any chance we could turn on email autoconfirmation? That was recently switched on for the LessWrong wiki, which was suffering from a similar level of spam by apparently the same exact spammers (down to usernames and page content, sometimes), and has worked wonders. --[[User:Gwern|Gwern]] 17:17, 14 December 2011 (UTC)<br />
<br />
:I'll have a look over the weekend. I'm not sure if I have root access to the box, but I'll see what I can do. &mdash;[[User:Ashley Y|Ashley Y]] 02:47, 26 January 2012 (UTC)<br />
<br />
:OK, I switched on $wgEmailConfirmToEdit. &mdash;[[User:Ashley Y|Ashley Y]] 01:55, 30 January 2012 (UTC)<br />
<br />
== Error in Hawiki.php ==<br />
<br />
I'm not sure if this is really causing any issues, but it's kind of alarming: If you look closely, you'll see that (under the hawiki skin) all the pages include essentially this HTML in teh <code>head</code>:<br />
<pre-html><br />
<script type="text/javascript" src="/haskellwiki/index.php?title=-&amp;action=raw&amp;smaxage=0&amp;gen=js&amp;useskin=hawiki"><br />
&lt;!-- site js --><br />
</script><br />
</pre-html><br />
<br />
Unfortunately, what comes back from MediaWiki when the browser asks for http://haskell.org/haskellwiki/index.php?title=-&action=raw&smaxage=0&gen=js&useskin=hawiki is not JavasSript, but instead this:<br />
<pre-html style="white-space: pre-wrap"><br />
<br /><br />
<b>Catchable fatal error</b>: Argument 1 passed to SkinHawiki::initPage() must be an instance of OutputPage, instance of StubObject given, called in /usr/share/mediawiki/includes/RawPage.php on line 165 and defined in <b>/srv/web/wikidata/skin/Hawiki.php</b> on line <b>23</b><br /><br />
</pre><br />
<br />
Similarly, there is a piece of CSS like this:<br />
<pre-css><br />
@import "/haskellwiki/index.php?title=-&action=raw&gen=css&maxage=18000&smaxage=0&useskin=hawiki";<br />
</pre-css><br />
and the same error occurs when the browser asks for http://haskell.org/haskellwiki/index.php?title=-&action=raw&gen=css&maxage=18000&smaxage=0&useskin=hawiki.<br />
<br />
P.S. It's also kind of annoying that most of the custom CSS is in wikistatic ([http://haskell.org/wikistatic/skins//hawiki/main.css hawiki/main.css]), rather than in [[MediaWiki:Common.css]] and [[MediaWiki:Hawiki.css]]. Though, now that I look really closely, I do see that [[MediaWiki:Common.css|Common.css]] not only exists, but even contains a few rules, which is nice!<br />
<br />
P.P.S. It's too bad we don't have the MediaWiki feature whereby users get to extend the skins by putting CSS/JS in subpages of their userpage...<br />
<br />
--[[User:SamB|SamB]] 05:45, 8 June 2011 (UTC)<br />
<br />
== I broke &lt;hask&gt; tags ==<br />
<br />
I'm guessing from your signature on [[HaskellWiki:Syntax_highlighting]] that you are the person to tell about this. See [[User:benmachine]]: it seems that leaving a comment tag unclosed inside a &lt;hask&gt; breaks syntax highlighting forever.<br />
--[[User:Benmachine|benmachine]] 19:31, 9 June 2011 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2012-01-26T02:49:20Z<p>Ashley Y: </p>
<hr />
<div>Please also email me after putting something on this page. &mdash;[[User:Ashley Y|Ashley Y]] 02:49, 26 January 2012 (UTC)<br />
<br />
== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
----<br />
<br />
Block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=HelenGarcia please. --[[User:Gwern|Gwern]] 01:09, 9 April 2010 (UTC)<br />
<br />
:And [[User:Carolin]]. --[[User:Gwern|Gwern]] 01:12, 9 April 2010 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)<br />
<br />
::Well, we were pretty fine for the last couple months, but then a few dozen/hundred spam accounts got registered...<br />
::It seems to me we need an active admin. I nominate myself. The discussion on -cafe about new admins [http://www.mail-archive.com/haskell-cafe@haskell.org/msg60954.html petered out] last time (Peterson never replied to me), but now it's a little more urgent. --[[User:Gwern|Gwern]] 01:21, 12 July 2010 (UTC)<br />
<br />
:::We're in the process of moving to a new server running Debian and MediaWiki 1.12. &mdash;[[User:Ashley Y|Ashley Y]] 01:44, 12 July 2010 (UTC)<br />
<br />
::::Which will no doubt help. But spammers won't block themselves. --[[User:Gwern|Gwern]] 03:43, 12 July 2010 (UTC)<br />
<br />
:::::I think MediaWiki 1.12 has some extensions that will help. &mdash;[[User:Ashley Y|Ashley Y]] 03:58, 12 July 2010 (UTC)<br />
<br />
:What's the process for approving people to be admin? Should I ping the Cafe list about it? &mdash;[[User:Ashley Y|Ashley Y]] 17:36, 12 July 2010 (UTC)<br />
<br />
::I don't think there is any process. I linked an email in which I suggested several people for adminship (including myself), and no one objected to any of my choices, which is pretty much how the English Wikipedia did things in the early days. --[[User:Gwern|Gwern]] 00:27, 13 July 2010 (UTC)<br />
<br />
=== Steady spam ====<br />
<br />
Any chance we could turn on email autoconfirmation? That was recently switched on for the LessWrong wiki, which was suffering from a similar level of spam by apparently the same exact spammers (down to usernames and page content, sometimes), and has worked wonders. --[[User:Gwern|Gwern]] 17:17, 14 December 2011 (UTC)<br />
<br />
:I'll have a look over the weekend. I'm not sure if I have root access to the box, but I'll see what I can do. &mdash;[[User:Ashley Y|Ashley Y]] 02:47, 26 January 2012 (UTC)<br />
<br />
== Error in Hawiki.php ==<br />
<br />
I'm not sure if this is really causing any issues, but it's kind of alarming: If you look closely, you'll see that (under the hawiki skin) all the pages include essentially this HTML in teh <code>head</code>:<br />
<pre-html><br />
<script type="text/javascript" src="/haskellwiki/index.php?title=-&amp;action=raw&amp;smaxage=0&amp;gen=js&amp;useskin=hawiki"><br />
&lt;!-- site js --><br />
</script><br />
</pre-html><br />
<br />
Unfortunately, what comes back from MediaWiki when the browser asks for http://haskell.org/haskellwiki/index.php?title=-&action=raw&smaxage=0&gen=js&useskin=hawiki is not JavasSript, but instead this:<br />
<pre-html style="white-space: pre-wrap"><br />
<br /><br />
<b>Catchable fatal error</b>: Argument 1 passed to SkinHawiki::initPage() must be an instance of OutputPage, instance of StubObject given, called in /usr/share/mediawiki/includes/RawPage.php on line 165 and defined in <b>/srv/web/wikidata/skin/Hawiki.php</b> on line <b>23</b><br /><br />
</pre><br />
<br />
Similarly, there is a piece of CSS like this:<br />
<pre-css><br />
@import "/haskellwiki/index.php?title=-&action=raw&gen=css&maxage=18000&smaxage=0&useskin=hawiki";<br />
</pre-css><br />
and the same error occurs when the browser asks for http://haskell.org/haskellwiki/index.php?title=-&action=raw&gen=css&maxage=18000&smaxage=0&useskin=hawiki.<br />
<br />
P.S. It's also kind of annoying that most of the custom CSS is in wikistatic ([http://haskell.org/wikistatic/skins//hawiki/main.css hawiki/main.css]), rather than in [[MediaWiki:Common.css]] and [[MediaWiki:Hawiki.css]]. Though, now that I look really closely, I do see that [[MediaWiki:Common.css|Common.css]] not only exists, but even contains a few rules, which is nice!<br />
<br />
P.P.S. It's too bad we don't have the MediaWiki feature whereby users get to extend the skins by putting CSS/JS in subpages of their userpage...<br />
<br />
--[[User:SamB|SamB]] 05:45, 8 June 2011 (UTC)<br />
<br />
== I broke &lt;hask&gt; tags ==<br />
<br />
I'm guessing from your signature on [[HaskellWiki:Syntax_highlighting]] that you are the person to tell about this. See [[User:benmachine]]: it seems that leaving a comment tag unclosed inside a &lt;hask&gt; breaks syntax highlighting forever.<br />
--[[User:Benmachine|benmachine]] 19:31, 9 June 2011 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2012-01-26T02:47:32Z<p>Ashley Y: /* Steady spam = */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
----<br />
<br />
Block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=HelenGarcia please. --[[User:Gwern|Gwern]] 01:09, 9 April 2010 (UTC)<br />
<br />
:And [[User:Carolin]]. --[[User:Gwern|Gwern]] 01:12, 9 April 2010 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)<br />
<br />
::Well, we were pretty fine for the last couple months, but then a few dozen/hundred spam accounts got registered...<br />
::It seems to me we need an active admin. I nominate myself. The discussion on -cafe about new admins [http://www.mail-archive.com/haskell-cafe@haskell.org/msg60954.html petered out] last time (Peterson never replied to me), but now it's a little more urgent. --[[User:Gwern|Gwern]] 01:21, 12 July 2010 (UTC)<br />
<br />
:::We're in the process of moving to a new server running Debian and MediaWiki 1.12. &mdash;[[User:Ashley Y|Ashley Y]] 01:44, 12 July 2010 (UTC)<br />
<br />
::::Which will no doubt help. But spammers won't block themselves. --[[User:Gwern|Gwern]] 03:43, 12 July 2010 (UTC)<br />
<br />
:::::I think MediaWiki 1.12 has some extensions that will help. &mdash;[[User:Ashley Y|Ashley Y]] 03:58, 12 July 2010 (UTC)<br />
<br />
:What's the process for approving people to be admin? Should I ping the Cafe list about it? &mdash;[[User:Ashley Y|Ashley Y]] 17:36, 12 July 2010 (UTC)<br />
<br />
::I don't think there is any process. I linked an email in which I suggested several people for adminship (including myself), and no one objected to any of my choices, which is pretty much how the English Wikipedia did things in the early days. --[[User:Gwern|Gwern]] 00:27, 13 July 2010 (UTC)<br />
<br />
=== Steady spam ====<br />
<br />
Any chance we could turn on email autoconfirmation? That was recently switched on for the LessWrong wiki, which was suffering from a similar level of spam by apparently the same exact spammers (down to usernames and page content, sometimes), and has worked wonders. --[[User:Gwern|Gwern]] 17:17, 14 December 2011 (UTC)<br />
<br />
:I'll have a look over the weekend. I'm not sure if I have root access to the box, but I'll see what I can do. &mdash;[[User:Ashley Y|Ashley Y]] 02:47, 26 January 2012 (UTC)<br />
<br />
== Error in Hawiki.php ==<br />
<br />
I'm not sure if this is really causing any issues, but it's kind of alarming: If you look closely, you'll see that (under the hawiki skin) all the pages include essentially this HTML in teh <code>head</code>:<br />
<pre-html><br />
<script type="text/javascript" src="/haskellwiki/index.php?title=-&amp;action=raw&amp;smaxage=0&amp;gen=js&amp;useskin=hawiki"><br />
&lt;!-- site js --><br />
</script><br />
</pre-html><br />
<br />
Unfortunately, what comes back from MediaWiki when the browser asks for http://haskell.org/haskellwiki/index.php?title=-&action=raw&smaxage=0&gen=js&useskin=hawiki is not JavasSript, but instead this:<br />
<pre-html style="white-space: pre-wrap"><br />
<br /><br />
<b>Catchable fatal error</b>: Argument 1 passed to SkinHawiki::initPage() must be an instance of OutputPage, instance of StubObject given, called in /usr/share/mediawiki/includes/RawPage.php on line 165 and defined in <b>/srv/web/wikidata/skin/Hawiki.php</b> on line <b>23</b><br /><br />
</pre><br />
<br />
Similarly, there is a piece of CSS like this:<br />
<pre-css><br />
@import "/haskellwiki/index.php?title=-&action=raw&gen=css&maxage=18000&smaxage=0&useskin=hawiki";<br />
</pre-css><br />
and the same error occurs when the browser asks for http://haskell.org/haskellwiki/index.php?title=-&action=raw&gen=css&maxage=18000&smaxage=0&useskin=hawiki.<br />
<br />
P.S. It's also kind of annoying that most of the custom CSS is in wikistatic ([http://haskell.org/wikistatic/skins//hawiki/main.css hawiki/main.css]), rather than in [[MediaWiki:Common.css]] and [[MediaWiki:Hawiki.css]]. Though, now that I look really closely, I do see that [[MediaWiki:Common.css|Common.css]] not only exists, but even contains a few rules, which is nice!<br />
<br />
P.P.S. It's too bad we don't have the MediaWiki feature whereby users get to extend the skins by putting CSS/JS in subpages of their userpage...<br />
<br />
--[[User:SamB|SamB]] 05:45, 8 June 2011 (UTC)<br />
<br />
== I broke &lt;hask&gt; tags ==<br />
<br />
I'm guessing from your signature on [[HaskellWiki:Syntax_highlighting]] that you are the person to tell about this. See [[User:benmachine]]: it seems that leaving a comment tag unclosed inside a &lt;hask&gt; breaks syntax highlighting forever.<br />
--[[User:Benmachine|benmachine]] 19:31, 9 June 2011 (UTC)</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:Site_softwareHaskellWiki:Site software2011-05-08T01:04:45Z<p>Ashley Y: </p>
<hr />
<div>HaskellWiki runs MediaWiki. See [[Special:Version]] for details.<br />
<br />
== Changes ==<br />
<br />
* [[MediaWiki:Common.css]]<br />
* Style sheet?<br />
<br />
== GeSHi source for Haskell ==<br />
<br />
* [http://haskell.org/haskellwiki-changes/haskell.php.txt haskell.php] (missing)</div>Ashley Yhttps://wiki.haskell.org/User_talk:GwernUser talk:Gwern2010-07-13T05:46:28Z<p>Ashley Y: </p>
<hr />
<div>==Sysopping==<br />
Gwern, I have added you to the groups [[Special:Listusers&group=sysop|sysop]] and [[Special:Listusers&group=checkuser|checkuser]].<br />
<br />
:Thanks. --[[User:Gwern|Gwern]] 03:02, 13 July 2010 (UTC)<br />
<br />
:Ashley, is Checkuser installed? I tried [[Special:Checkuser]] which is where the MW docs say it should be, but that's an error. --[[User:Gwern|Gwern]] 04:14, 13 July 2010 (UTC)<br />
<br />
::[[Special:CheckUser]]. No idea why there's a difference. Also [[Special:Specialpages]] is useful but seems not to be linked anywhere. &mdash;[[User:Ashley Y|Ashley Y]] 05:46, 13 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:GwernUser talk:Gwern2010-07-13T00:44:16Z<p>Ashley Y: +mop</p>
<hr />
<div>Gwern, I have added you to the groups [[Special:Listusers&group=sysop|sysop]] and [[Special:Listusers&group=checkuser|checkuser]].</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:New_accountsHaskellWiki:New accounts2010-07-12T17:41:30Z<p>Ashley Y: </p>
<hr />
<div>[[Special:Userlogin|New account creation has been re-enabled]], hopefully we'll be spared spammers. &mdash;[[User:Ashley Y|Ashley Y]] 17:41, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:New_accountsHaskellWiki:New accounts2010-07-12T17:41:19Z<p>Ashley Y: </p>
<hr />
<div>[[Special:Userlogin|New account creation has been re-enabled]], hopefully we'll be spared spammers. &mdash;[[User:Ashley Y|Ashley Y]] &mdash;[[User:Ashley Y|Ashley Y]] 17:41, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:SitenoticeMediaWiki:Sitenotice2010-07-12T17:40:22Z<p>Ashley Y: </p>
<hr />
<div></div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2010-07-12T17:36:17Z<p>Ashley Y: /* Spam & account registration */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
----<br />
<br />
Block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=HelenGarcia please. --[[User:Gwern|Gwern]] 01:09, 9 April 2010 (UTC)<br />
<br />
:And [[User:Carolin]]. --[[User:Gwern|Gwern]] 01:12, 9 April 2010 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)<br />
<br />
::Well, we were pretty fine for the last couple months, but then a few dozen/hundred spam accounts got registered...<br />
::It seems to me we need an active admin. I nominate myself. The discussion on -cafe about new admins [http://www.mail-archive.com/haskell-cafe@haskell.org/msg60954.html petered out] last time (Peterson never replied to me), but now it's a little more urgent. --[[User:Gwern|Gwern]] 01:21, 12 July 2010 (UTC)<br />
<br />
:::We're in the process of moving to a new server running Debian and MediaWiki 1.12. &mdash;[[User:Ashley Y|Ashley Y]] 01:44, 12 July 2010 (UTC)<br />
<br />
::::Which will no doubt help. But spammers won't block themselves. --[[User:Gwern|Gwern]] 03:43, 12 July 2010 (UTC)<br />
<br />
:::::I think MediaWiki 1.12 has some extensions that will help. &mdash;[[User:Ashley Y|Ashley Y]] 03:58, 12 July 2010 (UTC)<br />
<br />
:What's the process for approving people to be admin? Should I ping the Cafe list about it? &mdash;[[User:Ashley Y|Ashley Y]] 17:36, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:SitenoticeMediaWiki:Sitenotice2010-07-12T05:01:15Z<p>Ashley Y: </p>
<hr />
<div>'''Note:''' [[HaskellWiki:New accounts|new account creation]] has been disabled as an anti-spam measure. Hopefully this won't last long.</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:New_accountsHaskellWiki:New accounts2010-07-12T04:59:13Z<p>Ashley Y: </p>
<hr />
<div>[[Special:Userlogin|New account creation]] has been disabled again. &mdash;[[User:Ashley Y|Ashley Y]] 04:57, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:New_accountsHaskellWiki:New accounts2010-07-12T04:57:50Z<p>Ashley Y: </p>
<hr />
<div>[[Special:Userlogin|New account creation has been re-enabled]], hopefully we'll be spared spammers. &mdash;[[User:Ashley Y|Ashley Y]] 02:39, 16 March 2010 (UTC)<br />
<br />
[[Special:Userlogin|New account creation]] has been disabled again. &mdash;[[User:Ashley Y|Ashley Y]] 04:57, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2010-07-12T03:58:44Z<p>Ashley Y: /* Spam & account registration */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
----<br />
<br />
Block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=HelenGarcia please. --[[User:Gwern|Gwern]] 01:09, 9 April 2010 (UTC)<br />
<br />
:And [[User:Carolin]]. --[[User:Gwern|Gwern]] 01:12, 9 April 2010 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)<br />
<br />
::Well, we were pretty fine for the last couple months, but then a few dozen/hundred spam accounts got registered...<br />
::It seems to me we need an active admin. I nominate myself. The discussion on -cafe about new admins [http://www.mail-archive.com/haskell-cafe@haskell.org/msg60954.html petered out] last time (Peterson never replied to me), but now it's a little more urgent. --[[User:Gwern|Gwern]] 01:21, 12 July 2010 (UTC)<br />
<br />
:::We're in the process of moving to a new server running Debian and MediaWiki 1.12. &mdash;[[User:Ashley Y|Ashley Y]] 01:44, 12 July 2010 (UTC)<br />
<br />
::::Which will no doubt help. But spammers won't block themselves. --[[User:Gwern|Gwern]] 03:43, 12 July 2010 (UTC)<br />
<br />
:::::I think MediaWiki 1.12 has some extensions that will help. &mdash;[[User:Ashley Y|Ashley Y]] 03:58, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2010-07-12T01:44:40Z<p>Ashley Y: /* Spam & account registration */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
----<br />
<br />
Block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=HelenGarcia please. --[[User:Gwern|Gwern]] 01:09, 9 April 2010 (UTC)<br />
<br />
:And [[User:Carolin]]. --[[User:Gwern|Gwern]] 01:12, 9 April 2010 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)<br />
<br />
::Well, we were pretty fine for the last couple months, but then a few dozen/hundred spam accounts got registered...<br />
::It seems to me we need an active admin. I nominate myself. The discussion on -cafe about new admins [http://www.mail-archive.com/haskell-cafe@haskell.org/msg60954.html petered out] last time (Peterson never replied to me), but now it's a little more urgent. --[[User:Gwern|Gwern]] 01:21, 12 July 2010 (UTC)<br />
<br />
:::We're in the process of moving to a new server running Debian and MediaWiki 1.12. &mdash;[[User:Ashley Y|Ashley Y]] 01:44, 12 July 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:EditthispageMediaWiki:Editthispage2010-04-09T06:26:29Z<p>Ashley Y: Reverted edit of Ashley Y, changed back to last version by MediaWiki default</p>
<hr />
<div>Edit this page</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:EditthispageMediaWiki:Editthispage2010-04-09T06:24:26Z<p>Ashley Y: </p>
<hr />
<div>edit</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:SitenoticeMediaWiki:Sitenotice2010-04-09T05:53:18Z<p>Ashley Y: blanking, to clean up page appearance</p>
<hr />
<div></div>Ashley Yhttps://wiki.haskell.org/Talk:Tiny_Identifier_DictionaryTalk:Tiny Identifier Dictionary2010-03-28T22:06:03Z<p>Ashley Y: </p>
<hr />
<div>You might want to mention use as type variables vs. value variables. &mdash;[[User:Ashley Y|Ashley Y]] 22:06, 28 March 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:SitenoticeMediaWiki:Sitenotice2010-03-16T02:41:29Z<p>Ashley Y: </p>
<hr />
<div>[[Special:Userlogin|Create an account]] if you don't have one.</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:New_accountsHaskellWiki:New accounts2010-03-16T02:40:43Z<p>Ashley Y: </p>
<hr />
<div>[[Special:Userlogin|New account creation has been re-enabled]], hopefully we'll be spared spammers. &mdash;[[User:Ashley Y|Ashley Y]] 02:39, 16 March 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/HaskellWiki:New_accountsHaskellWiki:New accounts2010-03-16T02:39:43Z<p>Ashley Y: </p>
<hr />
<div>New account creation has been re-enabled, hopefully we'll be spared spammers. &mdash;[[User:Ashley Y|Ashley Y]] 02:39, 16 March 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2010-03-16T02:38:28Z<p>Ashley Y: /* Spam & account registration */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)<br />
<br />
== Spam & account registration ==<br />
<br />
It has been a while since the spam became a real issue and account registration was disabled. Creating accounts has proven kind of draining for me, even when I pushed byorgey up to be listed first. Is there any chance we could re-enable registration and see whether the spammers have given up? We are surely driving away potential contributors with such a laborious sign-up procedure. --[[User:Gwern|Gwern]] 00:38, 27 February 2010 (UTC)<br />
<br />
:OK, I've opened it up again. Hopefully we'll be OK. &mdash;[[User:Ashley Y|Ashley Y]] 02:38, 16 March 2010 (UTC)</div>Ashley Yhttps://wiki.haskell.org/DarcsDarcs2009-12-14T02:55:05Z<p>Ashley Y: /* Changes */</p>
<hr />
<div>'''darcs''' is a peer-to-peer revision control system, written in Haskell. It is the standard RCS of the Haskell community.<br />
<br />
== Understanding darcs ==<br />
<br />
You can think of a darcs repository as containing these things:<br />
<br />
* '''Patches''': a patch is a collection of changes that forms the unit of synchronisation with other repositories<br />
* Unrecorded '''changes''' to known files and directories<br />
* '''Unmanaged items''' (files and directories)<br />
* '''Boring items''': anything with a name matched in <tt>_darcs/prefs/boring</tt><br />
* The '''unrevert cache''' of changes<br />
<br />
Note that some projects are keen on making sure all derivative items are "boring" rather than merely unknown items that will show up with <tt>darcs wh -l</tt>. Other projects less so.<br />
<br />
== Operations ==<br />
<br />
=== Unmanaged items ===<br />
<br />
*<tt>darcs whatsnew -l</tt>: show changes to managed files, and unmanaged items<br />
<br />
*'''creating a item''': add item to the unmanaged items.<br />
<br />
*<tt>darcs add</tt>: convert the unmanaged item into a change to create the item and its contents<br />
<br />
*<tt>darcs remove</tt>: add a change which empties the item and deletes it, but keep it as an unmanaged item.<br />
<br />
=== Changes ===<br />
<br />
*<tt>darcs whatsnew</tt>: show unrecorded changes<br />
<br />
*'''removing a managed item''': add a change to remove the item<br />
<br />
*'''editing a managed file''': add a change for the edit<br />
<br />
*<tt>darcs mv</tt>: add a change to move an item<br />
<br />
*<tt>darcs replace</tt>: add a change to replace text in a file<br />
<br />
*<tt>darcs record</tt>: record changes to add a patch<br />
<br />
*<tt>darcs unrecord</tt>: remove a patch by turning back it into unrecorded changes<br />
<br />
*<tt>darcs amend-record</tt>: replace a patch with one with added changes<br />
<br />
*<tt>darcs revert</tt>: remove changes and put them in the unrevert cache. ''Warning: you will lose the previous contents of the unrevert cache.''<br />
<br />
*<tt>darcs unrevert</tt>: take changes out of the unrevert cache and add them to the unrecorded changes.<br />
<br />
=== Patches ===<br />
<br />
*<tt>darcs changes</tt>: show patches<br />
<br />
*<tt>darcs send --output=''FILE''</tt>: make an email bundle from patches<br />
<br />
*<tt>darcs send --to=''ADDRESS''</tt>: send an email bundle from patches<br />
<br />
*<tt>darcs pull</tt>: add patches from another repository<br />
<br />
*<tt>darcs push</tt>: add patches from this repository to another repository<br />
<br />
*<tt>darcs apply</tt>: add patches from an email bundle<br />
<br />
*<tt>darcs rollback</tt>: add a patch that is the inverse of an existing patch<br />
<br />
*<tt>darcs obliterate</tt>: remove a patch. ''Warning: if the patch doesn't exist elsewhere, you will lose that work.''<br />
<br />
*<tt>darcs tag</tt>: add a tag for the current set of patches<br />
<br />
=== Repositories ===<br />
<br />
*<tt>darcs initialize</tt>: create a new empty repository<br />
<br />
*<tt>darcs get</tt>: create a new empty repository and add patches from another repository<br />
<br />
== External links ==<br />
<br />
* [http://darcs.net/ darcs]<br />
* [http://en.wikibooks.org/wiki/Understanding_darcs Understanding darcs] - an illustrated wikibook about darcs and patch theory<br />
* Implementation details of <code>darcs</code> show motivating examples for [[generalised algebraic datatype]]s. The motivations are described in David Roundy's slides [http://darcs.net/fosdem_talk/talk.pdf Implementing the darcs patch formalism and verifying it] (see p. 11, 13--14.). The talk mentions also the notions of [[phantom type]], and [[existential type]], and [[type witness]] (see p. 15).<br />
* See [http://web.archive.org/web/20070409170354/http://darcs.net/DarcsWiki/Talks also other talks] on <code>darcs</code>. One of them ([http://darcs.net/cufp_2005.pdf The Myth and Reality of using Haskell in the ‘Real World’]) discusses a more general topic: usefulness of Haskell (in real life) and in general, the power of (lazy) functional programming.<br />
* [http://wiki.darcs.net/DarcsWiki/ConfictMiseryAnalysis Conflict bug] -(a problem in Darcs-1)<br />
* Free [http://patch-tag.com darcs hosting] for open source projects at patch-tag.com<br />
<br />
[[Category:Tools]]</div>Ashley Yhttps://wiki.haskell.org/DarcsDarcs2009-12-14T02:54:29Z<p>Ashley Y: </p>
<hr />
<div>'''darcs''' is a peer-to-peer revision control system, written in Haskell. It is the standard RCS of the Haskell community.<br />
<br />
== Understanding darcs ==<br />
<br />
You can think of a darcs repository as containing these things:<br />
<br />
* '''Patches''': a patch is a collection of changes that forms the unit of synchronisation with other repositories<br />
* Unrecorded '''changes''' to known files and directories<br />
* '''Unmanaged items''' (files and directories)<br />
* '''Boring items''': anything with a name matched in <tt>_darcs/prefs/boring</tt><br />
* The '''unrevert cache''' of changes<br />
<br />
Note that some projects are keen on making sure all derivative items are "boring" rather than merely unknown items that will show up with <tt>darcs wh -l</tt>. Other projects less so.<br />
<br />
== Operations ==<br />
<br />
=== Unmanaged items ===<br />
<br />
*<tt>darcs whatsnew -l</tt>: show changes to managed files, and unmanaged items<br />
<br />
*'''creating a item''': add item to the unmanaged items.<br />
<br />
*<tt>darcs add</tt>: convert the unmanaged item into a change to create the item and its contents<br />
<br />
*<tt>darcs remove</tt>: add a change which empties the item and deletes it, but keep it as an unmanaged item.<br />
<br />
=== Changes ===<br />
<br />
*<tt>darcs whatsnew</tt>: show unrecorded changes<br />
<br />
*'''removing an item''': add a change to remove the item<br />
<br />
*'''editing a managed file''': add a change for the edit<br />
<br />
*<tt>darcs mv</tt>: add a change to move an item<br />
<br />
*<tt>darcs replace</tt>: add a change to replace text in a file<br />
<br />
*<tt>darcs record</tt>: record changes to add a patch<br />
<br />
*<tt>darcs unrecord</tt>: remove a patch by turning back it into unrecorded changes<br />
<br />
*<tt>darcs amend-record</tt>: replace a patch with one with added changes<br />
<br />
*<tt>darcs revert</tt>: remove changes and put them in the unrevert cache. ''Warning: you will lose the previous contents of the unrevert cache.''<br />
<br />
*<tt>darcs unrevert</tt>: take changes out of the unrevert cache and add them to the unrecorded changes.<br />
<br />
=== Patches ===<br />
<br />
*<tt>darcs changes</tt>: show patches<br />
<br />
*<tt>darcs send --output=''FILE''</tt>: make an email bundle from patches<br />
<br />
*<tt>darcs send --to=''ADDRESS''</tt>: send an email bundle from patches<br />
<br />
*<tt>darcs pull</tt>: add patches from another repository<br />
<br />
*<tt>darcs push</tt>: add patches from this repository to another repository<br />
<br />
*<tt>darcs apply</tt>: add patches from an email bundle<br />
<br />
*<tt>darcs rollback</tt>: add a patch that is the inverse of an existing patch<br />
<br />
*<tt>darcs obliterate</tt>: remove a patch. ''Warning: if the patch doesn't exist elsewhere, you will lose that work.''<br />
<br />
*<tt>darcs tag</tt>: add a tag for the current set of patches<br />
<br />
=== Repositories ===<br />
<br />
*<tt>darcs initialize</tt>: create a new empty repository<br />
<br />
*<tt>darcs get</tt>: create a new empty repository and add patches from another repository<br />
<br />
== External links ==<br />
<br />
* [http://darcs.net/ darcs]<br />
* [http://en.wikibooks.org/wiki/Understanding_darcs Understanding darcs] - an illustrated wikibook about darcs and patch theory<br />
* Implementation details of <code>darcs</code> show motivating examples for [[generalised algebraic datatype]]s. The motivations are described in David Roundy's slides [http://darcs.net/fosdem_talk/talk.pdf Implementing the darcs patch formalism and verifying it] (see p. 11, 13--14.). The talk mentions also the notions of [[phantom type]], and [[existential type]], and [[type witness]] (see p. 15).<br />
* See [http://web.archive.org/web/20070409170354/http://darcs.net/DarcsWiki/Talks also other talks] on <code>darcs</code>. One of them ([http://darcs.net/cufp_2005.pdf The Myth and Reality of using Haskell in the ‘Real World’]) discusses a more general topic: usefulness of Haskell (in real life) and in general, the power of (lazy) functional programming.<br />
* [http://wiki.darcs.net/DarcsWiki/ConfictMiseryAnalysis Conflict bug] -(a problem in Darcs-1)<br />
* Free [http://patch-tag.com darcs hosting] for open source projects at patch-tag.com<br />
<br />
[[Category:Tools]]</div>Ashley Yhttps://wiki.haskell.org/Talk:What_a_Monad_is_notTalk:What a Monad is not2009-11-23T23:44:45Z<p>Ashley Y: </p>
<hr />
<div>==Nicolas Pouillard Comments==<br />
<br />
I disagree with:<br />
"So ordering is not in any way essential to what a monad is."<br />
<br />
There is commutative monads, great! Other than that the order is important. Moreover there is nothing wrong to see >>= as a sequencing operator.<br />
<br />
I also disagree the "IO is impure" paragraph:<br />
Indeed only IO will trigger visible side effects, but this is only due to the common evaluation of IO primitives. Moreover I would say that only the runtime system is impure because it does reduce 'main :: IO ()', other than that we are<br />
just building a computation plan in a pure way.<br />
<br />
Although I agree that the common issue is too mix monad and impurity, and the impurity question is only releated to IO.<br />
<br />
== "Monads are not values" ==<br />
<br />
Yes they are! But they are not of the type of their arguments. For instance "return 3" is a value that has (or can have) type "IO Int". But it is not a value of type Int. &mdash;[[User:Ashley Y|Ashley Y]] 23:44, 23 November 2009 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User:Ashley_YUser:Ashley Y2009-08-18T07:59:28Z<p>Ashley Y: compilers</p>
<hr />
<div>'''Ashley Yakeley'''<br />
<br />
I hereby license all my contributions to this wiki under the simple permissive license on [[HaskellWiki:Copyrights]]. &mdash;[[User:Ashley Y|Ashley Y]] 05:25, 14 January 2006 (UTC)<br />
<br />
I am one of [[Special:Listusers&group=sysop|the two admins]] on this wiki.<br />
<br />
[http://haskell.org/ghc/dist/current/docs/libraries/ Current libraries]<br />
<br />
[[HaskellWiki:Style test]]<br />
<br />
Haskell - the language of choice for people smarter than you.<br />
<br />
[[Special:CheckUser]]<br />
<br />
__TOC__<br />
<br />
== Haskell wishes ==<br />
<br />
Add:<br />
* Top-level <hask><-</hask><br />
* Kind declarations<br />
<br />
Remove:<br />
* old-style <hask>deriving</hask> (newtype deriving is OK)<br />
* Typeable & Dynamic<br />
* Generics and all that "Scrap Your Boilerplate" nonsense<br />
* numeric defaulting<br />
* n+k patterns<br />
<br />
== Compilers ==<br />
<br />
[[AHC]] [[BHC]] [[CHC]] [[DHC]] [[EHC]]<br/><br />
[[FHC]] [[GHC]] [[HHC]] [[IHC]] [[JHC]]<br/><br />
[[KHC]] [[LHC]] [[MHC]] [[NHC]] [[OHC]]<br/><br />
[[PHC]] [[QHC]] [[RHC]] [[SHC]] [[THC]]<br/><br />
[[UHC]] [[VHC]] [[WHC]] [[XHC]] [[YHC]]<br/><br />
[[ZHC]]</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2009-08-18T07:56:34Z<p>Ashley Y: /* Request for MediaWiki Upgrade */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
:This will require a larger update to the machine that runs HaskellWiki, which I can't do easily. &mdash;[[User:Ashley Y|Ashley Y]] 07:56, 18 August 2009 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)<br />
<br />
::Yes, loads. --[[User:Gwern|Gwern]] 01:09, 7 August 2009 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2009-08-06T22:16:56Z<p>Ashley Y: /* Spam */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
:Done. &mdash;[[User:Ashley Y|Ashley Y]] 22:16, 6 August 2009 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)</div>Ashley Yhttps://wiki.haskell.org/User_talk:Ashley_YUser talk:Ashley Y2009-08-06T22:14:49Z<p>Ashley Y: /* Sitenotice */</p>
<hr />
<div>== Math Content ==<br />
<br />
Hi Ashley. I notice you are a sysop for haskellwiki. I'm not sure if this is a good place to ask this, but do you know if there is a reason why math support is not enabled for this wiki? I was planning to add some simple math background for some things and would have liked it to show appropriately. (If it is just because no one was sure on how to configure it, I'd be happy to tell what I had to do for my personal home wiki (same software)). [[User:BrettGiles|BrettGiles]] 22:16, 25 February 2006 (UTC)<br />
<br />
:Now switched on. If it's not showing up on a page, purge the page by adding <tt>&amp;action=purge</tt> to the end of the URL. &mdash;[[User:Ashley Y|Ashley Y]] 00:20, 27 February 2006 (UTC)<br />
<br />
:: Thank you - works perfectly. [[User:BrettGiles|BrettGiles]] 18:15, 27 February 2006 (UTC)<br />
<br />
== haskell.org skin? ==<br />
<br />
Hi Ashley. I hope you're the right person to ask about this. I'm currently setting up a wiki, and I was wondering how you got haskellwiki looking like it does? I really hate the wikipedia look, and I'd like something nice and simple I could tweak. I understand that you can get skins for mediawiki - is the haskell.org look available in this form? - [[User:MikeDodds|MikeDodds]] 12:33, 1 March 2006 (UTC)<br />
<br />
:I suppose I should publish the skin file somehow. I'm not sure the best way. &mdash;[[User:Ashley Y|Ashley Y]] 09:44, 25 March 2006 (UTC)<br />
<br />
:OK, see [[HaskellWiki:Site software]]. &mdash;[[User:Ashley Y|Ashley Y]] 01:15, 20 September 2006 (UTC)<br />
<br />
== [[Libraries and tools]] copyright status ==<br />
<br />
Dear Ashley Y,<br />
<br />
I saw that the page [[Libraries and tools/Genetic programming]] got a <nowiki>{{unknown copyright}}</nowiki> mark in the recent days during the moving to its own separate page. This mark asks me to resolve the copyright status.<br />
<br />
It was me who wrote the content of this page ([http://www.haskell.org/haskellwiki/?title=Libraries_and_tools&diff=2265&oldid=2252 here is the diff page showing this]) in February, so I thought it need not be licenced explicitly, it is automatically licenced under [[HaskellWiki:Licensing]].<br />
<br />
Have I to do something?<br />
<br />
Tank You very much in advance<br />
<br />
Best wishes<br />
<br />
[[User:EndreyMark|EndreyMark]] 12:32, 24 March 2006 (UTC)<br />
<br />
:Great, go ahead and remove the "unknown copyright" label. &mdash;[[User:Ashley Y|Ashley Y]] 09:42, 25 March 2006 (UTC)<br />
<br />
:Thank You, I have done it. [[User:EndreyMark|EndreyMark]] 18:05, 25 March 2006 (UTC)<br />
<br />
== Deletion of [[Continuation passing style]] ==<br />
<br />
Dear Ashley,<br />
<br />
Acidentally, I have created a [[Continuation passing style]] page superfluously.<br />
Because a [[Continuation]] article exists already, I suppose the superfluous empty page should be deleted, because its existence can be confusing (e.g. editors linking word "[[Continuation passing style]]" will not get a warning red link any more, but a misleading empty page). I cannot delete the page (only empty it, but it is not enough).<br />
<br />
Thank You in advance<br />
<br />
[[User:EndreyMark|EndreyMark]] 08:14, 27 October 2006 (UTC)<br />
<br />
:I made it a redirect instead. &mdash;[[User:Ashley Y|Ashley Y]] 18:44, 31 October 2006 (UTC)<br />
<br />
== Interwiki map ==<br />
<br />
Hi: could you add some stuff to the interwiki map? In [[Haste]], I was trying to interwiki to the English Wikipedia using the usual <nowiki>[[wikipedia:Scintilla]]</nowiki> interwiki link, but it didn't work (nor did en:, or wiki: - which just took one to c2.com). [[User:Gwern|Gwern]]<br />
<br />
== Same logo, less bytes ==<br />
<br />
If you're interested in using it, I shaved 407 bytes off the logo in the upper-left-hand corner of the wiki. It's [[:Image:Haskellwiki_logo_small.png|uploaded here]]. [[User:Olathe|Olathe]] 00:33, 12 August 2008 (UTC)<br />
<br />
== Latex upgrade ==<br />
While testing Pandoc's conversion of LaTeX to MediaWiki markup, I noticed some bugs. Compare [[User:Gwern/kenn]] to [https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn https://secure.wikimedia.org/wikipedia/en/wiki/User:Gwern/kenn]. The haskell.org version features many ugly red sections like '<nowiki>Failed to parse (unknown function\begin): \begin{array}{rclcl} \phi & ::= & P(t_1, \cdots, t_n) \\ & \mid & \neg\phi \\ & \mid & \phi_1 \Rightarrow \phi_2 \\ & \mid & TT & \mid & FF \\ & \mid & \phi_1 \wedge \phi_2 & \mid & \phi_1 \vee \phi_2 \\ & \mid & \forall x.\, \phi & \mid & \exists x.\, \phi \end{array}</nowiki>'.<br />
<br />
John MacFarlane, Pandoc's author, thinks this is because of outdated addons to MediaWiki or MediaWiki itself; this is consistent with the same source text not producing those errors on the English Wikipedia. Could you fix this? --[[User:Gwern|Gwern]] 10:46, 6 September 2008 (UTC)<br />
<br />
== Request for MediaWiki Upgrade ==<br />
I request that you update the MediaWiki software to a more recent version. Thanks in advance. &mdash;[[User:HowardBGolden|HowardBGolden]] 08:17, 4 October 2008 (UTC)<br />
<br />
== Spam ==<br />
An indef block of http://www.haskell.org/haskellwiki/?title=Special:Contributions&target=D0rk23 please. --[[User:Gwern|Gwern]] 12:22, 7 July 2009 (UTC)<br />
<br />
== Sitenotice ==<br />
[[MediaWiki:Sitenotice]] needs editing badly; I have seen many people assume that no accounts are being created. Any change in wording would be better - how about 'To request an account, click here'? --[[User:Gwern|Gwern]] 13:36, 6 August 2009 (UTC)<br />
<br />
:Is this better? &mdash;[[User:Ashley Y|Ashley Y]] 22:14, 6 August 2009 (UTC)</div>Ashley Yhttps://wiki.haskell.org/MediaWiki:SitenoticeMediaWiki:Sitenotice2009-08-06T22:14:21Z<p>Ashley Y: </p>
<hr />
<div>[[HaskellWiki:New accounts|Request an account]] if you don't have one.</div>Ashley Y