我在一个名为initials
的函数中定义了一个名为person
的函数,但我无法弄清楚如何在initials
之外调用person
:< / p>
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] ++ "."
是否可以调用initials
函数中的main
函数,即使它是在person
函数内定义的?
答案 0 :(得分:6)
您误解了where
的作用:它只是定义范围,意味着它们只能用于它们所附加的项目,在这种情况下,initials
只能用于person
。
换句话说,您正在定义一个函数person :: String -> String -> [String]
(取两个字符串并返回它们的列表),其中此函数的内部实现细节包括一些名为initials
的(未使用的)值。 不就像其他语言中的结构或类一样,其中initials
是所有person
都可以访问的值。 (无论如何person
只返回一个字符串列表,而不是一个新类型。)另外,.
不是一个字段访问器,它只是一个方便的函数组合助手。
您似乎想要制作Person
数据类型,例如
data Person = Person { firstName :: String, lastName :: String }
这是通过"record syntax"定义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] ++ "."
这与
一样使用putStrLn (initials (Person { firstName = "first", lastName = "last" }))
-- or, just using positional arguments (which still work with record syntax)
putStrLn (initials (Person "first" "last"))
答案 1 :(得分:1)
initials
不是一个功能。它只是您在person
正文中定义的变量。如果您只想显示首字母,那就很简单:
main =
putStrLn (initials "John" "Doe")
initials :: String -> String -> String
initials firstName lastName =
[firstInitial] ++ "." ++ [lastInitial] ++ "."
where
firstInitial = firstName !! 0
lastInitial = lastName !! 0
在GHCi中:
*Main> main
J.D.
或者,在略高的抽象层次上,
main =
putStrLn (initials ["John", "Queue", "Public"])
initials :: [String] -> String
initials (name:names) = [name !! 0] ++ "." ++ initials names
initials _ = ""
在GHCi中:
*Main> main
J.Q.P.
我不完全理解为什么你写了person
函数 - 它返回&#34; John.Doe&#34;输入&#34;约翰&#34;和&#34; Doe&#34;,但我不知道这对于打印首字母有多大帮助&#34; J.D。&#34;。