Como se ha comentado, todo valor (sea primitivo o estructurado) tiene asignado un único tipo. Estos tipos -denominados tipos primitivos en contraposición a los tipos personalizados que podemos crear- están organizados de forma jerárquica teniendo en su cúspide el tipo any, que clasifica o incluye a todos los demás tipos. El listado de tipos primitivos es el siguiente:
- any, tipo que engloba los demás
- null, que clasifica el valor nulo (null)
- logical, que clasifica los valores "verdadero" (true) y "falso" (false)
- number, que clasifica valores numéricos
- time, que clasifica valores de “hora” (referencias en el tiempo: lo que en español implica lo que llamamos horas, minutos y segundos)
- date, que clasifica valores de fecha
- datetime, que clasifica valores de fecha y hora
- datetimezone, que clasifica valores de fecha y hora con zona horaria
- duration, que clasifica valores de duración
- text, que clasifica textos
- binary, que clasifica valores binarios
- type, que clasifica tipos
- list, que clasifica listas de valores
- record, que clasifica registros de valores
- table, que clasifica tablas de valores
- function, que clasifica funciones
- anynonnull, que clasifica cualquier valor que no sea nulo
- none, tipo que no clasifica ningún valor
Los tipos primitivos no son los tipos que tienen asignados los valores primitivos, sino los tipos que existen por defecto en el lenguaje M (asociables tanto a valores primitivos como a valores estructurados). La nomenclatura usada por Microsoft puede resultar ambigua en este sentido.