为什么这个字典功能不起作用
Why this dictionary function is not working
我正在尝试使用 here 中的代码创建和使用字典:
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
但我收到以下错误:
$ 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 }
问题是什么,在 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
您询问有关插入多个元素的问题。为此,您可以使用折叠来编写一个名为 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
我正在尝试使用 here 中的代码创建和使用字典:
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
但我收到以下错误:
$ 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 }
问题是什么,在 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
您询问有关插入多个元素的问题。为此,您可以使用折叠来编写一个名为 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