我的函数将把字符串中的任何数字替换为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
答案 0 :(得分:2)
您的replaceString
已经返回了一个字符列表,但我想您想获取一个数字列表,答案只是将'3'
和'4'
替换为3
和4
:),所以它会变成这样:
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