confused about composite function with map in haskell -
let f = map tail.lines f "fsdaf\nfdsf\n"
why work?
let f = map tail.tail.lines f "fasdf\nfasdfdsfd\n"
i result:
["asdfdsfd"] let f = map (tail.tail).lines f "fasdf\nfasdfdsfd\n"
i result:
["sdf","sdfdsfd"]
i want know haskell how parse code above.
lets @ first example:
let f = map tail.tail.lines f "fasdf\nfasdfdsfd\n"
firstly, lines
breaks input string array of strings: ["fasdf","fasdfdsfd"]
.
now, working right left, tail
drops "head" of list: ["fasdfdsfd"]
lastly, map tail
applies "tail" each element in list: ["asdfdsfd"]
your second example works similarly:
let f = map (tail.tail).lines f "fasdf\nfasdfdsfd\n"
again, break input string array of strings: ["fasdf","fasdfdsfd"]
now however, you're creating composite function (tail.tail)
(drop "head" of list, twice), , mapping each element in list.
therefore drop first 2 characters of each string.
["sdf","sdfdsfd"]
both examples working intended. have read associativity , composite functions in haskell understand more it.
edit: difference this:
map tail (tail lines)
vs map (tail.tail) lines
remember in haskell, functions first class citizens - can create composite functions (example: (+1).(+1)
) , other operations (such map
function list) not common in other languages.
Comments
Post a Comment