将字符串中的每个字符映射到1或0

时间:2019-01-29 18:07:51

标签: haskell

mapbinary :: String -> [Int]

我正在尝试使用此函数将字符串转换为具有10的列表。 我的想法是我应该将通过isLetter返回true的每个char映射为1,将所有其他char映射为0。

我一直在尝试类似map (isLetter x)之类的方法,但是我不知道从哪里开始。

2 个答案:

答案 0 :(得分:3)

我假设您正在使用Data.Char.isLetter。在这种情况下,您几乎是正确的,只需使用Bool

Int转换为fromEnum
mapbinary :: String -> [Int]
mapbinary x = map (fromEnum . isLetter) x  -- Point-free-versión = map $ fromEnum . isLetter 

答案 1 :(得分:2)

您在正确的轨道上。

map      :: (a    -> b    ) -> [a] -> [b]
isLetter ::  Char -> Bool

您可以立即将它们结合起来制成:

map isLetter :: [Char] -> [Bool]
map isLetter :: String -> [Bool] -- equivalently

这与您要查找的内容非常接近,唯一的不同是它返回TrueFalse,而不是分别返回10。因此,您还需要为此做些事情。

我们可以定义执行此操作的函数boolToInt

boolToInt :: Bool -> Int
boolToInt False = 0
boolToInt True = 1

但是,在这种情况下,前奏函数fromEnum会执行相同的操作。

map fromEnum . map isLetter :: String -> [Int]

或者,等效地:

map (fromEnum.isLetter) :: String -> [Int]