read
может разобрать строку в число с плавающей точкой и int:
Prelude> :set +t
Prelude> read "123.456" :: Float
123.456
it :: Float
Prelude> read "123456" :: Int
123456
it :: Int
Но проблема (1) в вашем шаблоне:
createGroceryItem (a:b:c) = ...
Здесь :
- бинарный (справа ассоциативный) оператор, который добавляет элемент в список. RHS элемента должен быть списком. Поэтому, учитывая выражение a:b:c
, Haskell выведет следующие типы:
a :: String
b :: String
c :: [String]
т.е. c
будет считаться списком строк. Очевидно, он не может быть read
или передаваться в любые функции, ожидающие строку.
Вместо этого вы должны использовать
createGroceryItem [a, b, c] = ...
если в списке должно быть ровно 3 элемента, или
createGroceryItem (a:b:c:xs) = ...
если ≥3 пунктов приемлемо.
Также (2) выражение
makeGroceryItem a read b read c
будет интерпретироваться как makeGroceryItem
с 5 аргументами, 2 из которых являются функцией read
. Вам необходимо использовать круглые скобки:
makeGroceryItem a (read b) (read c)