'Ocaml : This expression has type int but an expression was expected of type int ref [closed]
Having this code:
type player = Orange | Red | Blue | White ;;
type piece =
Knight of player
| Town of player
| City of player
| Road of player
| Wool of player
| Brick of player
| Lumber of player
| Grain of player
| Ore of player ;;
let posessions =
[| Ore Orange; Road Red; Ore Blue; Ore White;
Lumber White; Ore Red; Knight Red; Road Orange;
Lumber Red; Brick Red; City White; Lumber White;
Wool Red; City White; Ore White; Brick White;
Road Blue; Lumber Blue; Grain Orange; Wool Red;
Road White; Knight White; Grain White; Wool Orange;
City Blue; Ore Orange; Knight Orange; Brick White;
Ore Red; Ore White; Road Orange; Knight Red;
Lumber Orange; Wool Orange; City Orange; Wool Blue;
Lumber White; City Red; Grain Red; Lumber Red;
Ore White; Grain White; Brick Orange; Brick White;
Road Blue; Grain Red; Ore White; City White;
Road White; Knight Orange; Brick Red; Ore White;
Lumber Orange; Ore Blue; Road Blue; Brick White;
Brick Orange; Ore Orange; Ore Blue; Ore Orange;
Ore Orange; Brick Orange; Brick White; Road Orange;
Lumber White; Knight Red; Brick White; Brick Orange;
Road Blue; Brick Orange; Lumber Blue; Road Blue;
Ore Red; Grain Blue; Wool Red; Town Red; Ore Orange;
Lumber White; Road Red; Road Blue; Town Blue;
Wool Red; Lumber Blue; Wool Blue; Town Red;
Grain Orange; Brick Blue; Knight Red; Wool White;
Ore Orange; Ore Blue; Lumber White; Wool White;
Brick Orange; Ore Blue; Grain Red; Wool Blue;
Road Red; Ore Blue; Lumber Orange |];;
let if_orange array =
let counter = ref 0
and roadcounter = ref 0
and knightcounter = ref 0
and n = Array.length array in
for i = 0 to n - 1 do
let a = Array.get array i in
(if a = (Town Orange) then counter := !counter + 1
else if a = (City Orange) then counter := !counter + 2
else if a = (Road Orange) then roadcounter := !roadcounter + 1
else if a = (Knight Orange) then knightcounter := !knightcounter + 1
else counter := !counter + 0)
done ;
(if roadcounter >= 5 then counter := !counter + 2
else counter := !counter + 0)
(if knightcounter >= !3 then counter := !counter + 2
else counter := !counter + 0 );
!counter;;
In for loop, I just wanted to add up some values to counter if the statements are valid. After it, I wanted to save the values for the counter, roadcounter and knightcounter. Then, in least to last if statement, increase the value of counter if roadcounter >= 5 (and save counter) and similarly for the knightcounter. However, I'm getting an error after I compile.
Error: This expression has type int but an expression was expected of type int ref
Am I supposed to int ref number 5 for comparison? Or did I somehow misplace the () or ;;?
Solution 1:[1]
Your problem is in this line:
if roadcounter >= 5 then
Indeed, roadcounter is an int ref, but you're comparing it to an int. You need ! before roadcounter.
There is a similar error a few lines later.
Update
Thanks for adding the types. However, they are not well formed. The definition of type piece stops abruptly in the middle of the keyword of.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
