Как объединить две функции в одну в Haskell

#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. Спасибо! Теперь я понимаю это, и это работает, так что действительно идеальный ответ 🙂