如何将sum函数集成到我的Haskell函数中?

时间:2017-05-05 14:59:06

标签: function haskell functional-programming

我的函数将把字符串中的任何数字替换为3,将任何字符替换为4.例如,“foo123”将替换为“444333”。我的问题是如何将“444333”转换为列表以使用sum函数。 “444333” - > [4,4,4,3,3,3] - >总和[4,4,4,3,3,3] = 21

这是我的代码

replaceString [] = []
replaceString (x:xs) =
      if x `elem` ['0'..'9']
      then '3' :replaceString xs
      else if x `elem` ['a'..'z']
      then '4' : replaceString xs
      else x : replaceString xs

2 个答案:

答案 0 :(得分:2)

您的replaceString已经返回了一个字符列表,但我想您想获取一个数字列表,答案只是将'3''4'替换为34 :),所以它会变成这样:

replaceString [] = []
replaceString (x:xs) = (if x `elem` ['0'..'9']
                       then 3
                       else 4) : replaceString xs

请注意,我们不需要重复: replaceString xs :)。

或者,如果你想将数字字符列表转换为数字列表,你可以得到字符的“序数”并从中减去48,在haskell中,字符的序数可以通过fromEnum char获得,并使用replaceString put '3''4'(而不是数字),我们可以定义一个这样的函数:

convertToDigits numstr = map ((48 -) . fromEnum) numstr

顺便说一句,你的原始函数不会将任何其他字符转换为4而只会转换为字母字符,因此对于foo21!,结果将是44433!,如果replaceString,您不希望对此进行求和,如果你想过滤数字我建议你甚至在调用(48 -) . fromEnum之前用非字母数字字符过滤字符串。

编辑:

正如Thomas指出的那样,您可以将digitToInt替换为Data.Char(需要从%let Px1='12345'; PROC SQL; CREATE TABLE CLAIM1 AS SELECT b.MEMBERID , b.ENROL_MN , CASE WHEN (a.PROCEDURE = &Px1.) THEN 1 ELSE 0 END AS CPT_+&Px1. , a.DX1 , a.DX2 , a.DX3 , a.DX4 FROM ENROLLMENT as b left join CLAIMS as a on a.MEMBERID = b.MEMBERID; QUIT; 导入)。

答案 1 :(得分:0)

如果您使用地图并阅读它应该很有效

funct l = map(\x ->read [x]::Int) l

sum funct("444333") = 21