And*_*een 0 haskell nested-function
我已经定义了一个名为函数initials内部的函数person,但我无法弄清楚如何在initials外面调用person:
main =
--I attempted to print the output of the initials function here.
(putStrLn ((person "firstName" "lastName") . initials)) --Not in scope: `initials'
--If this function call worked correctly, the output would be "f.l.".
person firstName lastName =
firstName ++ ["."] ++ lastName
where
fullName = firstName ++ " " ++ lastName
firstInitial = firstName !! 0
lastInitial = lastName !! 0
initials = [firstInitial] ++ "." ++ [lastInitial] ++ "."
Run Code Online (Sandbox Code Playgroud)
是否可以调用initials函数内部的main函数,即使它是在函数内部定义的person?
你误解了where它的作用:它只是定义范围,意味着它们只能用于它们所附加的项目,在这种情况下,initials只能用于person.
换句话说,您正在定义一个函数person :: String -> String -> [String](接受两个字符串并返回它们的列表),其中此函数的内部实现细节包括一些(未使用的)值initials.它没有像其他语言结构或类,这里initials是所有的一些值personS能访问.(无论如何person只返回一个字符串列表,而不是一个新类型.)此外,.它不是一个字段访问器,它只是一个方便的函数组合帮助器.
看起来你可能想要制作Person数据类型,比如
data Person = Person { firstName :: String, lastName :: String }
Run Code Online (Sandbox Code Playgroud)
这是Person通过"记录语法"定义的.
现在,您可以编写一个函数来获取Person并返回它们的首字母:
-- using pattern matching
initials (Person {firstName = f, lastName = l}) =
[f !! 0] ++ "." ++ [l !! 0] ++ "."
-- or, using the accessors implicitly defined via record syntax
initials p = [firstName p !! 0] ++ "." ++ [lastName p !! 0] ++ "."
Run Code Online (Sandbox Code Playgroud)
这是用的
putStrLn (initials (Person { firstName = "first", lastName = "last" }))
-- or, just using positional arguments (which still work with record syntax)
putStrLn (initials (Person "first" "last"))
Run Code Online (Sandbox Code Playgroud)