
On 10 Feb 2005, at 20:17, Dmitri Pissarenko wrote:
Hello!
I have a list of instances of the ClassifiedImage class, which is defined as follows.
data ClassifiedImage = ClassifiedImage {imageFileName :: String, subjectID :: String} deriving Show
Attribute imageFileName contains a file name of a certain image. I want to "transform" the list [ClassifiedImage] into a list [(ClassifiedImage, Image)], where Image is content of the file with name imageFileName.
That is, I want to have a routine, which iterates through the list of ClassifiedImages, reads each file (with filename contained in the attribute ClassifiedImage.imageFileName) and stores its content in a variable.
I have already a function, which reads the content of a file.
My idea is to use map for this task:
readClassifiedImages :: [ClassifiedImage] -> [(ClassifiedImage, Image)] readClassifiedImages classifiedImages = do return map readerFunc classifiedImages
readerFunc denotes some function, which takes the attribute imageFileName of a ClassifiedImage instance.
I suppose that this readerFunc looks like shown below.
readerFunc :: ClassifiedImage -> (ClassifiedImage, Image) readerFunc classifiedImage = (classifiedImage, fileContent) where fileName = classifiedImageFileName classifiedImage fileContent = readImage fileName
classifiedImageFileName :: ClassifiedImage -> String
In order for this function to work, I need to define classifiedImageFileName, which "returns" the imageFileName attribute of an instance of ClassifiedImage class.
This is called a selector function. Haskell defines one automatically with the same name as the field. imageFileName is a function ClassifiedImage -> String. (ClassifiedImage is not a class, it's a datatype, by the way)
How can I define this function?
Can I use map for readImage function, which is in the IO domain? If not, what tutorial can help me?
If you're happy to replace Image with IO image, then that will be fine. Jules