Проблема не в системе типов. Но с вашими чеками. Если вы напишите:
<b>head</b> x == "1"
Haskell выведет, что тип head x
должен быть String
, и, следовательно, x
должен быть [String]
. Но поскольку x
является первым элементом вашего списка, это String
, а не [String]
. Вы можете исправить это, сравнивая с символом, например:
head x == <b>'1'</b>
Однако мы можем использовать здесь сопоставление с образцом, делая код не только более элегантным, но и более безопасным. Например, даже если ваш текущий код скомпилируется, это вызовет ошибку на [""]
, поскольку head ""
, конечно, не имеет смысла.
Мы можем определить функцию, подобную:
may_convergent:: [[Char]] -> String
may_convergent [] = "empty list"
may_convergent ((<b>'1'</b>:_):_) = "May-convergent "
may_convergent ((<b>'0'</b>:xs):_) = xs
may_convergent (_:xs) = may_convergent xs