Оператор as
может использоваться только для ссылочных типов, он не может быть перегружен и вернет null
в случае сбоя операции. Это никогда не вызовет исключения.
Приведение может использоваться для любых совместимых типов, оно может быть перегружено, и оно выдаст исключение в случае сбоя операции.
Выбор того, что использовать, зависит от обстоятельств. Прежде всего, это вопрос того, хотите ли вы выдать исключение при неудачном преобразовании.
Рекурсивное сопоставление с образцом с пониманием Списка
crossProduct [] b=[]
crossProduct (x : xs) b= [(x,b)] ++ crossProduct xs b
cartProd _ []=[]
cartProd x (u:uv) = crossProduct x u ++ cartProd x uv