rns*_*nso 0 dictionary haskell compiler-errors type-mismatch do-notation
我正在尝试使用此处的代码创建和使用字典:
import Data.List (lookup)
insert :: Eq a => (a,b) -> [(a,b)] -> [(a,b)]
insert (a,b) [] = [(a,b)]
insert (a,b) ((c,d):rest) = if a == c
then (a,b) : rest
else (c,d) : insert (a,b) rest
dict :: [(String, String)]
dict = [("", "")]
main = do
insert ("onekey", "onevalue") dict
print dict
print $ lookup "onekey" dict
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
$ runghc rndict.hs
rndict.hs:22:1: error:
• Couldn't match expected type ‘IO t0’ with actual type ‘[()]’
• In the expression: main
When checking the type of the IO action ‘main’
rndict.hs:24:9: error:
• Couldn't match type ‘IO’ with ‘[]’
Expected type: [()]
Actual type: IO ()
• In a stmt of a 'do' block: print dict
In the expression:
do { insert ("onekey", "onevalue") dict;
print dict;
print $ lookup "onekey" dict }
In an equation for ‘main’:
main
= do { insert ("onekey", "onevalue") dict;
print dict;
print $ lookup "onekey" dict }
rndict.hs:25:9: error:
• Couldn't match type ‘IO’ with ‘[]’
Expected type: [()]
Actual type: IO ()
• In a stmt of a 'do' block: print $ lookup "onekey" dict
In the expression:
do { insert ("onekey", "onevalue") dict;
print dict;
print $ lookup "onekey" dict }
In an equation for ‘main’:
main
= do { insert ("onekey", "onevalue") dict;
print dict;
print $ lookup "onekey" dict }
Run Code Online (Sandbox Code Playgroud)
有什么问题,在 Haskell 中使用字典的正确方法是什么?
您需要使用let将新字典绑定到名称:
import Data.List (lookup)
insert :: Eq a => (a,b) -> [(a,b)] -> [(a,b)]
insert (a,b) [] = [(a,b)]
insert (a,b) ((c,d):rest) = if a == c
then (a,b) : rest
else (c,d) : insert (a,b) rest
dict :: [(String, String)]
dict = [("", "")]
main = do
let d = insert ("onekey", "onevalue") dict
print d
print $ lookup "onekey" d
Run Code Online (Sandbox Code Playgroud)
您询问插入多个元素。为此,您可以使用折叠来编写一个名为insertMany. 您可能应该使用,foldl'但我会将其留作练习以找出原因。
import Data.List (lookup)
insert :: Eq a => (a,b) -> [(a,b)] -> [(a,b)]
insert (a,b) [] = [(a,b)]
insert (a,b) ((c,d):rest) = if a == c
then (a,b) : rest
else (c,d) : insert (a,b) rest
insertMany :: Eq a => [(a,b)] -> [(a,b)] -> [(a,b)]
insertMany elements dict =
foldl (flip insert) dict elements
dict :: [(String, String)]
dict = [("", "")]
main = do
let d = insert ("onekey", "onevalue") dict
print d
print $ lookup "onekey" d
print $ insertMany [("onekey", "newvalue"), ("anotherkey", "anothervalue")]
dict
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |