在字符串上映射一个函数
Map a function over a string
我的理解是 Haskell 中的 String
是 Char
角色的列表。所以我应该能够将函数 Char -> Whatever
映射到字符串上,对吗?
testChar :: Char -> String
testChar c = c:c:[]
myFunc :: String -> String
myFunc str = map testChar str
main = do
putStrLn $ myFunc "hi"
当我 运行 我得到:
Couldn't match type ‘[Char]’ with ‘Char’
Expected type: Char -> Char
Actual type: Char -> String
In the first argument of ‘map’, namely ‘testChar’
In the expression: map testChar str
我做错了什么?
testChar :: Char -> String
testChar c = c:c:[]
myFunc :: String -> String
myFunc str = map testChar str
这两个没有意义。 testChar
将 Char
映射到不同的类型,而您希望 map
映射该函数并在另一侧得到 相同的 类型? myFunc
实际上 return 是 [[Char]]
,而不是 [Char]
/String
。
也许你的意思是 concatMap
?
ghci
是你的朋友:
Prelude> let testChar c = c:c:[]
Prelude> let myFunc str = map testChar str
Prelude> :t myFunc
myFunc :: [a] -> [[a]]
Prelude> myFunc "abc"
["aa","bb","cc"]
对比:
Prelude> let myFunc' str = concatMap testChar str
Prelude> :t myFunc'
myFunc' :: [b] -> [b]
Prelude> myFunc' "abc"
"aabbcc"
写这个函数的各种等效方式:
myFunc' str = concatMap testChar str
myFunc' = concatMap testChar
myFunc' str = str >>= testChar
myFunc' = (>>= testChar)
我的理解是 Haskell 中的 String
是 Char
角色的列表。所以我应该能够将函数 Char -> Whatever
映射到字符串上,对吗?
testChar :: Char -> String
testChar c = c:c:[]
myFunc :: String -> String
myFunc str = map testChar str
main = do
putStrLn $ myFunc "hi"
当我 运行 我得到:
Couldn't match type ‘[Char]’ with ‘Char’
Expected type: Char -> Char
Actual type: Char -> String
In the first argument of ‘map’, namely ‘testChar’
In the expression: map testChar str
我做错了什么?
testChar :: Char -> String
testChar c = c:c:[]
myFunc :: String -> String
myFunc str = map testChar str
这两个没有意义。 testChar
将 Char
映射到不同的类型,而您希望 map
映射该函数并在另一侧得到 相同的 类型? myFunc
实际上 return 是 [[Char]]
,而不是 [Char]
/String
。
也许你的意思是 concatMap
?
ghci
是你的朋友:
Prelude> let testChar c = c:c:[]
Prelude> let myFunc str = map testChar str
Prelude> :t myFunc
myFunc :: [a] -> [[a]]
Prelude> myFunc "abc"
["aa","bb","cc"]
对比:
Prelude> let myFunc' str = concatMap testChar str
Prelude> :t myFunc'
myFunc' :: [b] -> [b]
Prelude> myFunc' "abc"
"aabbcc"
写这个函数的各种等效方式:
myFunc' str = concatMap testChar str
myFunc' = concatMap testChar
myFunc' str = str >>= testChar
myFunc' = (>>= testChar)