#function #haskell #merge
#функция #haskell #объединить
Вопрос:
Я хочу объединить две функции в одну.
Функции являются
data Dice = Stone Char deriving (Show, Eq)
calculateScore :: [Dobbelsteen] -> Int
calculateScore xs = sum[giveValueDice x | x <- xs]
giveValueDice :: Dice -> Int
giveValueDice (Stone d) = if d == 'W' then 5 else digitToInt d
Обычно я бы просто скопировал одну строку в первую функцию и немного изменил, чтобы сделать синтаксис правильным. Но здесь я немного растерялся, как это сделать
Комментарии:
1. Что вы хотите, чтобы новая функция делала? Что такое
Dobbelsteen
? Что такоеgiveValueDice
?
Ответ №1:
Как вы уже заметили, вы не можете просто встроить здесь; причина этого в том, что вы сопоставляете шаблон на Stone
в giveValueDice
. Это сопоставление с шаблоном можно переместить в правую часть списка для понимания:
calculateScore :: [Dobbelsteen] -> Int
calculateScore xs = sum[if d == 'W' then 5 else digitToInt d | (Stone d) <- xs]
Другим методом объединения этих двух функций является использование where
предложения, которое «объединяет» одну функцию в другую, сохраняя их различие:
calculateScore :: [Dobbelsteen] -> Int
calculateScore xs = sum[giveValueDice x | x <- xs]
where
giveValueDice :: Dice -> Int
giveValueDice (Stone d) = if d == 'W' then 5 else digitToInt d
Комментарии:
1. Спасибо! Теперь я понимаю это, и это работает, так что действительно идеальный ответ 🙂