haskell - automatic typing of nested lists -
while working through richard bird's thinking functionally haskell, came across demonstration of haskell's type system find puzzling (p. 44):
[ [], [[]], [[[]]] ] :: [[[[a]]]]to explain, let main list have type
[b]. first element list,b=[c]. second element list of lists,c=[d]. third element list of lists of lists,d=[a]
doesn't type signature indicate first element of main list has type [[[a]]]? don't see how that's possible.
let's rewrite this:
l = [l1, l2, l3] l1 = [] l2 = [[]] l3 = [[[]]] now assign type variables: ab initio
l1 :: b l2 :: b l3 :: b since have have same type, l has type [b]. now, more specifically,
l1 :: [c] l2 :: [[d]] l3 :: [[[e]]] to justify number of brackets. these still have same type b, i.e. in fact
l1 :: [[[e]]] l2 :: [[[e]]] l3 :: [[[e]]] and
l = [ [] :: [[[e]]] , [[]] :: [[[e]]] , [[[]]] :: [[[e]]] ] which whole has type [[[[e]]]]. or, if prefer, [[[[a]]]].
perhaps gets clearer if consider more interesting specific examples. following [int] lists:
[1,2,3][1][0][]
these [[int]] lists:
[ [1,2], [1,2,3] ][ [1], [2] ][ [1], [] ][ [] ][ ]
and these [[[int]]] lists:
[ [[1]], [[2],[]], [[3],[],[]] ][ [[]], [[1]], [[2,3]] ][ [], [[]] ][ [[]] ][ ]
note empty list [] possible types. list containing empty list, [[]] possible [[int]] , [[[int]]], , list containing list empty list needs doubly-nested list [[[int]]].
Comments
Post a Comment