C    "Things we want to find labels for They have names and attributes A Datum has Attributes Attributes have a name and a set of possible values The type for our DecisionTree a node asks for this attribute Band has children which can be found with a value of the attribute Leafs have labels  0Build a DecisionTree from the given Trainingset ;Which value does this Datum have for the given Attribute? Extract a label )Decide which label belongs to this Datum IPartitions the Dataset according to the possible values of the attribute "Computes the entropy of a Dataset 1the Entropy is defined as: sum (p_i * log_2 p_i) # where p_i = |{ x | x has Label i}|/ |Dataset| GHow much information does this Attribute give us for the given Dataset  it is defined as Kentropy(set) - sum p_i * entropy {dat_i | dat has value i for attribute a}  the data the Attribute the Information AReturn the attribute which gives us greatest gain in information +groups a Dataset using a Map. According to #haskell " efficient"' grouping needs Ord. I agree with that "how to extract a key from a Datum -how to make a Datum into a value for the map >how to fuse two values (should we have > 1 Data for this key) the list we want to group          DecisionTree-0.0Data.DecisionTreeDatumDdName attributes AttributeAaNamepossibleValues DecisionTree PreLabeledbuilddecideNodeattchildLeafshowTreegetValuelabel partitionentropy groupLabels information bestAttribute groupWith