在Haskell中调用嵌套函数

时间:2014-06-16 01:53:53

标签: haskell nested-function

我在一个名为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函数内定义的?

2 个答案:

答案 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;。