Read, Eval, Print, Loop: REPL
NOTE: Assume import Prelude in all examples unless otherwise noted.
Intro
|
It takes some practice to get familiar about when you can use one of |
$ npx spago repl
PSCi, version 0.14.5
Type :? for help
:? +
The following commands are available:
:? Show this help menu
:quit Quit PSCi
:reload Reload all imported modules while discarding bindings
:clear Discard all imported modules and declared bindings
:browse <module> See all functions in <module>
:type <expr> Show the type of <expr>
:kind <type> Show the kind of <type>
:show import Show all imported modules
:show loaded Show all loaded modules
:show print Show the repl's current printing function
:paste paste Enter multiple lines, terminated by ^D
:complete <prefix> Show completions for <prefix> as if pressing tab
:print <fn> Set the repl's printing function to <fn> (which must be fully qualified)
Further information is available on the PureScript documentation repository: PSCi.
:type
According to the help, :type is for expressions:
> :type 'a'
Char
> :type "w"
String
> :type 'w'
Char
> :type "w"
String
> :type 1
Int
> :type 3.14
Number
> :type []
forall (t1 :: Type). Array t1
Then we try something like:
> :type 1 .. 3
Unknown operator (..)
> :type range 1 3
Unknown operator (..)
Wait! 1 .. 3 is an expression, and so is range 1 3.
We just need to import range and its synonym .. from some module that offers a range function:
> import Data.List (range, (..)) >
:type 1 .. 3 List Int
:type range 1 3 List Int
The fact is that .. is an infix synonym (or alias if you will) for range.
Since range is a function, it is a value, an since .. is a synonym for range, .. is a value too.
Just remember that most non alphabetic function names are generally infix, and to get info on infix operators, we generally need to enclose them inside parenthesis:
> :type ..
Unexpected or mismatched indentation at line 1, column 1
> :type (..)
Int -> Int -> List Int
See how the same error and solution applies for compose, for example:
> :type <<<
Unexpected or mismatched indentation at line 1, column 1
> :type (<<<)
forall (t33 :: Type) (a :: t33 -> t33 -> Type) (b :: t33) (c :: t33) (d :: t33). Semigroupoid @t33 a => a c d -> a b c -> a b d
You can take a look at .. in
Pursuit.
Click view source and see it is defined as:
infix 8 range as ..
:kind
As seen earlier, :kind shows the kind of a type.
It works for the types and type constructors. For example:
> :kind Array
Type -> Type
It means Array is a type constructor that is not fully realized (it means it is awaiting for more types) that takes a type which then return the fully realized type.
If we say Array, it is an array of what?
Numbers? Chars? Strings?
Or an array of lists?
Or even an array of arrays?
We donโt know that by simply saying Array.
It needs a further type in order to be fully realized:
> :kind Array Char
Type
> :kind Array String
Type
> :kind Array (Array Int)
Type
When :kind <type> returns Type, you may rest assured you are dealing with a fully realized type.
If it returns Type → Type, it is awaiting one type argument in order to be fully realized.
If it says Type → Type → Type, it means it is awaiting for two more type
arguments in order to be fully realized, and so on and so forth.