I'm trying to create an abstraction for a lightweight data storage module using an F# signature file. Here is my signature file code, let's say it's called repository.fsi
namespace DataStorage
/// <summary>Lightweight Repository Abstraction</summary>
module Repository =
/// <summary> Insert data into the repository </summary>
val put: 'a -> unit
/// <summary> Fetch data from the repository </summary>
val fetch: 'a -> 'b
/// <summary> Remove data from the repository </summary>
val remove: 'a -> unit
Here is the corresponding implementation, let's call it repository.fs
namespace DataStorage
module Repository =
(* Put a document into a database collection *)
let put entity = ()
(* Select a document from a database collection *)
let fetch key = ("key",5)
(* Remove a document from a database collection *)
let remove entity = ()
In my visual studio project file I have the signature file (repository.fsi) above my implementation file (repository.fs). The put and remove functions are being parsed and verified correctly with no errors (in the implementation file) but the fetch function keeps giving me the red squiggly in visual studio with the following error message:
Module 'DataStorage.Repository' contains
val fetch: s:string -> string * int
but its signature specifies
val fetch<'a,'b> : 'a -> 'b
The respective type parameter counts differ
Can someone tell me what I'm doing wrong? Is my fetch function value defined wrong in my signature file? I'm just trying to create a generic function ('a -> 'b) in my signature file and have the implementation take one type as input and return a different type as output.