Как лучше всего реализовать функцию makeCloths
, используя функции высшего порядка? Я надеюсь достичь того, что makeCloths
может автоматически заполнять каждый метод в methodsList
правильными аргументами, которые предоставлены в materialList
. Так что в будущем, если в methodsList
будут добавлены дополнительные методы, и методы будут использовать только аргументы в materialList
, нам не потребуется изменять код в makeCloths
.
data Material = WhiteCloth Int
| BlueCloth Int
| RedCloth Int
makeWhiteShirt :: Material -> Clothe
makeWhiteShirt (WhiteCloth x) = .....
makeBluePants :: Material -> Clothe
makeBluePants (BlueCloth x) = .....
makeRedBlueDress :: Material -> Material -> Clothe
makeRedBlueDress (RedCloth x) (BlueCloth y) = ......
methodsList = [ makeWhiteShirt, makeBluePants, makeRedBlueDress ]
materialList = [ WhiteCloth 3, BlueCloth 2, RedCloth 2]
-- call makeCloths like so
-- listOfClothes = makeCloths methodsList materialList
makeCloths :: [a] -> [b] -> [Clothe]
1 ответ
Во-первых, как предлагали многие другие, haskell не позволит вам иметь массив функций, мощность которых не совпадает. Вы хотите, чтобы makeRedBlueDress имел тип Material -> Clothe. Если вам действительно нужен такой полиморфизм, ничто не мешает нам определить дополнительный тип для Материала, который принимает несколько аргументов (или состоит из нескольких Материалов).
Как только мы это сделаем, makeCloths станет частным случаем функции zipWith.
makeCloths = zipWith $ \x y -> (x y)
Подпись типа для него имеет наибольший смысл
zipWith $ \x y -> (x y) :: [b -> c] -> [b] -> [c]
Похожие вопросы
Новые вопросы
haskell
Haskell — это чисто функциональный язык программирования со строгой статической типизацией, отложенными вычислениями, обширной поддержкой параллелизма и параллелизма, а также уникальными возможностями абстракции.
Clothe
? Этот код - ваша собственная работа или взят из задания?makeWhiteShirt
имеет типMaterial -> Clothe
, аmakeRedBlueDress
имеет типMaterial -> Material -> Clothe
, поэтому они не могут быть оба в одном списке (все в списке должно имеют один и тот же тип). Кроме того, что произойдет, если я вызовуmakeWhiteShirt
с аргументомRedCloth 1
? Выдает ли это ошибку?[Material] -> Clothe
или, возможно,[Material] -> Maybe Clothe
, если вы не уверены, что из доступных материалов можно сделать кусок ткани.