如何在Haskell中将两个功能合并为一个

时间:2019-04-03 21:46:03

标签: function haskell merge

我想将两个功能合并为一个。

功能是

 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 个答案:

答案 0 :(得分:4)

您已经注意到,您不能只在此处直接内联;原因是您正在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