I have given Brian's approach a go today and it has worked out very well for me. The updated code is pushed to the repository. It still needs a lot of tidying up but the basic type structure is now present, the inventory works and processes can now start to be defined. For example `tryMakeSteel steelMill (recipe: Recipe) (materialList: MaterialList): Material option`, although I still need to add some test for this function actually does what I want it to.
Thank you to every one who contributed to answering my question.