I'm beginning my first exploration of functional programming with Haskell
. I'm struggling a bit with printing a hardcoded value. I created a model representing a car and the gears it can go to. What I want to do is simply print my hardcoded civicNinetyOne
when I call printCar.
But I keep getting an error when I load the file. I posted the error below, it's an indentation error but from what I've read here at LearnYouAHaskell that call function declaration is correct. Can someone point me to the cause of this issue? Thank you
Error
first_program.hs:10:1: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
10 | printCar:: () -> Car | ^
Code
data Car = Car{
gears :: [String],
currentGear :: String,
brokeGears :: [String],
shiftStroke:: Strokes
}
let civicNinetyOne = Car ["gear1", "gear2", "gear3", "gear4", "gear5"] "gear1" ["gear4"] [("gear1","pull", "gear2"), ("gear2","push", "gear3"), ("gear3","skipShift", "gear5")]
printCar:: () -> Car
printCar = civicNinetyOne
printCar
takes an argument like any other function; it's argument type is ()
, which means there is only one value (also spelled ()
) that can be used to call it.
civicNinetyOne
, on the other hand, is a value with type Car
, not a function of type () -> Car
, so cannot itself be assigned to printCar
.
The correct definition is
printCar :: () -> Car
printCar () = civicNinetyOne
and it would be called as
> printCar ()
Car {gears = ["gear1","gear2","gear3","gear4","gear5"], currentGear = "gear1", brokeGears = ["gear4"], shiftStroke = [("gear1","pull","gear"),("gear2","push","gear3"),("gear3","skipShift","gear5")]}
For completeness, the let
(as pointed out in the comments) is optional in recent versions of GHCi and required in older versions of GHCi, but it is forbidden in a module. (The interactive interpreter behaves somewhat like an implied do
block.)