codesnippets:recordsyntax
This is an old revision of the document!
Table of Contents
Record syntax
Advantages
- can document the intended use of fields
- see example 1
- provides functions to get the records content
- see example 2
- example 1:
- example 2:
print $ rnCol xc
Disadvantages
With sum types combined: risk of runtime errors
An algebraic sum type (see also https://en.wikipedia.org/wiki/Algebraic_data_type regarding sum types) is a type with different constructors seperated by |. Record syntax can generate errors, if combined with sum types.
- example:
- output:
Test2-exe.exe: No match in record selector nDiameterInMM
Risk of namespace colisions without strong coding rules
Fields from records can be extrated by the accessor functions that have been declared within the record. Alternatively, records can be extrated by pattern matching, as well. If you use both with the same name then the pattern matching will shadow the accessor function(s).
- example 1:
module Main where main :: IO () main = do print $ nCol xc {-| to be able to print into a 'CharMatrix' * prefix: xc * instance of Formatting to print the stored characters -} data MatrixCursor = MatrixCursor { -- | the row, starting at 0 nRow :: Integer, -- | the column starting at 0 nCol :: Integer } deriving Show xc :: MatrixCursor xc = incMatrixCursorCol 5 $ incMatrixCursorCol 2 $ incMatrixCursorCol 3 $ initMatrixCursor incMatrixCursorCol :: Integer -> MatrixCursor -> MatrixCursor incMatrixCursorCol n (MatrixCursor nRow nCol) = (MatrixCursor nRow (nCol+n)) initMatrixCursor :: MatrixCursor initMatrixCursor = (MatrixCursor 0 0)
- compiler warning, using
stack ghc – -Wall ./app/Main.hs:[1 of 1] Compiling Main ( app\Main.hs, app\Main.o ) app\Main.hs:25:36: warning: [-Wname-shadowing] This binding for `nRow' shadows the existing binding defined at app\Main.hs:16:9 | 25 | incMatrixCursorCol n (MatrixCursor nRow nCol) = (MatrixCursor nRow (nCol+n)) | ^^^^ app\Main.hs:25:41: warning: [-Wname-shadowing] This binding for `nCol' shadows the existing binding defined at app\Main.hs:18:9 | 25 | incMatrixCursorCol n (MatrixCursor nRow nCol) = (MatrixCursor nRow (nCol+n)) | ^^^^ Linking app\Main.exe ...
- example 2:
{-| to be able to print into a 'CharMatrix' * prefix: xc * instance of Formatting to print the stored characters -} data MatrixCursor = MatrixCursor { -- | the row, starting at 0 nRow :: Integer, -- | the column starting at 0 nCol :: Integer } deriving Show xc :: MatrixCursor xc = incMatrixCursorCol 5 $ incMatrixCursorCol 2 $ incMatrixCursorCol 3 $ initMatrixCursor incMatrixCursorCol :: Integer -> MatrixCursor -> MatrixCursor incMatrixCursorCol n xc@(MatrixCursor nRow nCol) = (MatrixCursor (nRow xc) (nCol+n)) initMatrixCursor :: MatrixCursor initMatrixCursor = (MatrixCursor 0 0)
- compiler output:
[2 of 2] Compiling Main app\Main.hs:25:67: error: * Couldn't match expected type `MatrixCursor -> Integer' with actual type `Integer' * The function `nRow' is applied to one argument, but its type `Integer' has none In the first argument of `MatrixCursor', namely `(nRow xc)' In the expression: (MatrixCursor (nRow xc) (nCol + n)) | 25 | incMatrixCursorCol n xc@(MatrixCursor nRow nCol) = (MatrixCursor (nRow xc) (nCol+n)) | ^^^^^^^
You could leave a comment if you were logged in.
codesnippets/recordsyntax.1616267630.txt.gz · Last modified: (external edit)
