我想创建一个函数,String在一个类型列表中查找[(String, Int)]并返回Int与之配对的函数String.
像这样:
?> assignmentVariable "x" [("x", 3), ("y", 4), ("z", 1)]
3
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的:
assignmentVariable :: String -> [(String, Int)] -> Int
assignmentVariable [] = error "list is empty"
assignmentVariable n (x:xs) = if x == n
then xs
else assignmentVariable
Run Code Online (Sandbox Code Playgroud)
我怎么写这个?
我们来看看发布的代码:
assignmentVariable::String -> [(String, Integer)] -> Integer
assignmentVariable [] = error "list is empty"
assignmentVariable n (x:xs) = if x == n then xs else ...
Run Code Online (Sandbox Code Playgroud)
第一个方程只有一个参数,而第二个方程有两个.我们来解决这个问题.
assignmentVariable::String -> [(String, Integer)] -> Integer
assignmentVariable _ [] = error "list is empty"
assignmentVariable n (x:xs) = if x == n then xs else ...
Run Code Online (Sandbox Code Playgroud)
既然我们这样做x == n,这些变量必须是同一类型.然而,n::String和x::(String,Integer).我们需要x在比较之前拆分成组件.
assignmentVariable::String -> [(String, Integer)] -> Integer
assignmentVariable _ [] = error "list is empty"
assignmentVariable n ((m,x):xs) = if m == n then xs else ...
Run Code Online (Sandbox Code Playgroud)
结果xs是一个列表,而不是Integer类型签名所暗示的.你只想要x那里.
assignmentVariable::String -> [(String, Integer)] -> Integer
assignmentVariable _ [] = error "list is empty"
assignmentVariable n ((m,x):xs) = if m == n then x else ...
Run Code Online (Sandbox Code Playgroud)
最后,递归调用.什么时候m/=n,我们想尝试列表中的其他对xs,所以:
assignmentVariable::String -> [(String, Integer)] -> Integer
assignmentVariable _ [] = error "list is empty"
assignmentVariable n ((m,x):xs) = if m == n
then x
else assignmentVariable n xs
Run Code Online (Sandbox Code Playgroud)