Не используйте length xs > 0
(в sig
);он бесполезно считает длину xs
, когда все, что вы действительно хотели знать - пусто ли оно.Используйте null xs
для проверки непустого списка:
...
where sig | null xs = ... -- Empty case
| otherwise = ... -- Non-empty case
или добавьте аргумент к sig
и сопоставление с образцом:
...
where sig (y:ys) = ...
sig [] = ...
Хотя совет Натана Сандерса заменитьвся рекурсивная вещь с intercalate
превосходна и делает это спорным.
Вы также определяете тип, передавая всю строку "var:type"
в type
, так что это тестирование
"string" `isInfixOf` "name:string"
и т. Д.
Вы можете использовать break
или span
вместо takeWhile
для разделения имени и ввода ранее:
create_fields (x:xs) = xname ++ type xtype ++ sig
where
(xname, _:xtype) = break (==':') x
sig = ...
изатем type
может сравнивать на равенство строк или искать значения, используя Map
.
Краткое объяснение этого использования break
:
break (==':') "name:string" == ("name", ":string")
Затем при связывании
(xname, _:xtype) to ("name", ":string"),
xname -> "name"
_ -> ':' (discarded)
xtype -> "string"