Difference between revisions of "PFP Laboratory 1"

From Marek Běhálek Wiki
Jump to navigation Jump to search
(Created page with "== Working environment == *Run <code>ghci</code> from the command line. it will start GHC Interpreter, the output should be something like this: </translate> <syntaxhighligh...")
 
Line 17: Line 17:
  
 
It should report a problem in function <code>plus</code> (you can not use <code>+</code> with letter, it can be repaired by removing <code>+ 'a'</code>). Report from VS Code is refreshed whenever the source file is saved on disk.
 
It should report a problem in function <code>plus</code> (you can not use <code>+</code> with letter, it can be repaired by removing <code>+ 'a'</code>). Report from VS Code is refreshed whenever the source file is saved on disk.
 +
 +
== Types ==
 +
 +
*Using the GHCi command <code>:info</code>, learn the type of the following functions (and operators): <code>+, sqrt, succ, max</code>
 +
*Get the information about the data type of following expressions and evaluate them. it is possible using the command <code>:type</code>. You can switch this option on for all commands by <code>:set +t</code> (removing by <code>:unset +t</code>). 
 +
</translate>
 +
<syntaxhighlight lang="Haskell" >
 +
5 + 8
 +
3 * 5 + 8
 +
2 + 4
 +
sqrt 16
 +
succ 6
 +
succ 7
 +
pred 9
 +
pred 8
 +
sin (pi / 2)
 +
truncate pi
 +
round 3.5
 +
round 3.4
 +
floor 3.7
 +
ceiling 3.3
 +
mod 10 3
 +
odd 3
 +
</syntaxhighlight>
 +
 +
* At presentations, we have spoken about some basic types: <code> Int, Double, Bool, Char</code>. For each of previous expressions assign them the most appropriate of these basic data types. You can verify your guess by using <code>::</code>. For example, for the first expression, let's assume it is <code>Int</code>. We can cast the result to integer and get the following result.
 +
 +
<syntaxhighlight lang="Haskell" class="myDark" >
 +
Prelude> :type (5 + 8) :: Int
 +
(5 + 8) :: Int :: Int
 +
</syntaxhighlight>
 +
 +
If we try incorrect conversion to <code>Char</code>, we get the following result.
 +
 +
<syntaxhighlight lang="Haskell" class="myDark" >
 +
Prelude> :type (5 + 8) :: Char
 +
 +
<interactive>:1:2: error:
 +
    * No instance for (Num Char) arising from a use of `+'
 +
    * In the expression: (5 + 8) :: Char
 +
</syntaxhighlight>
 +
 +
For this expression, also the type <code>Double</code> works.
 +
 +
<syntaxhighlight lang="Haskell" class="myDark" >
 +
Prelude> :type (5 + 8) :: Double
 +
(5 + 8) :: Double :: Double
 +
</syntaxhighlight>
 +
 +
== Reasoning about types ==
 +
 +
For following expression, try to determine:
 +
*if the expression's type is correct;
 +
*what will be the type of the result;
 +
*what will be the result;
 +
*put the expression into the interpreter, and verify your claims.
 +
 +
<syntaxhighlight lang="Haskell">5.9/7
 +
(floor 5.9)/7
 +
floor 5.9/7
 +
fromIntegral floor 5.9/7
 +
fromIntegral (floor 5.9)/7
 +
div (floor 5.9) 7
 +
(floor 5.9) div 7
 +
(floor 5.9) `div` 7
 +
mod 10/2 3
 +
mod (floor (10/2)) 3
 +
</syntaxhighlight>
  
 
== First program in Haskell ==  
 
== First program in Haskell ==  
Line 31: Line 99:
 
</div>
 
</div>
 
<div style="clear:both"></div>
 
<div style="clear:both"></div>
 +
 +
== I Want More Functions ==
  
 
== Real first program in Haskell ==
 
== Real first program in Haskell ==

Revision as of 13:21, 27 September 2022

Working environment

  • Run ghci from the command line. it will start GHC Interpreter, the output should be something like this:

</translate>

GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
Prelude>
  • If you write expression, for example 1+2*3, it should be evaluated. You can close this interpreter by typing :q.
  • Open Visual Studio Code, create a file simple.hs and put there following lines of code:
doubleMe x = x * x

plus x y  = x + y + 'a'

It should report a problem in function plus (you can not use + with letter, it can be repaired by removing + 'a'). Report from VS Code is refreshed whenever the source file is saved on disk.

Types

  • Using the GHCi command :info, learn the type of the following functions (and operators): +, sqrt, succ, max
  • Get the information about the data type of following expressions and evaluate them. it is possible using the command :type. You can switch this option on for all commands by :set +t (removing by :unset +t).

</translate>

5 + 8 
3 * 5 + 8
2 + 4
sqrt 16 
succ 6
succ 7
pred 9
pred 8
sin (pi / 2)
truncate pi
round 3.5
round 3.4 
floor 3.7 
ceiling 3.3
mod 10 3
odd 3
  • At presentations, we have spoken about some basic types: Int, Double, Bool, Char. For each of previous expressions assign them the most appropriate of these basic data types. You can verify your guess by using ::. For example, for the first expression, let's assume it is Int. We can cast the result to integer and get the following result.
Prelude> :type (5 + 8) :: Int
(5 + 8) :: Int :: Int

If we try incorrect conversion to Char, we get the following result.

Prelude> :type (5 + 8) :: Char

<interactive>:1:2: error:
    * No instance for (Num Char) arising from a use of `+'
    * In the expression: (5 + 8) :: Char

For this expression, also the type Double works.

Prelude> :type (5 + 8) :: Double
(5 + 8) :: Double :: Double

Reasoning about types

For following expression, try to determine:

  • if the expression's type is correct;
  • what will be the type of the result;
  • what will be the result;
  • put the expression into the interpreter, and verify your claims.
5.9/7
(floor 5.9)/7
floor 5.9/7
fromIntegral floor 5.9/7
fromIntegral (floor 5.9)/7
div (floor 5.9) 7
(floor 5.9) div 7
(floor 5.9) `div` 7
mod 10/2 3
mod (floor (10/2)) 3

First program in Haskell

In your favorite development environment (VS Code by default):

  • Crate a file simple.hs.
  • Create a function pythagoras a b that computes c based on . Necessary functions can be found: Hoogle
  • Open ghci and run the implemented function with 3 4. File can be loaded using command :l (:load) and reloaded with :r (:reload).
pythagoras a b = sqrt (a*a + b*b)
Try it!

I Want More Functions

Real first program in Haskell

If you are complaining, that all programming courses should start with printing "Hello world!" on the screen and that is why previous task sucks. Do the following exercise.

  • Crate a file firstProgram.hs with following content:
main = do putStr "Hello world!"
  • Compile it with 'GHC compiler' (command ghc).
  • It should produce an executable file firstProgram(.exe), run this file.

</translate>