0

我在一个名为的函数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] ++ "."

initials是否可以在函数内部调用该main函数,即使它是在person函数内部定义的?

4

2 回答 2

6

您误解了where它的作用:它只是范围定义,这意味着它们只能在它们所附加的项目中使用,在这种情况下,initials只能在person.

换句话说,您正在定义一个函数person :: String -> String -> [String](获取两个字符串并返回它们的列表),该函数的内部实现细节包括一些(未使用的)值,称为initials. 它不像其他语言中的结构或类,其中initials有一些所有persons 都可以访问的值。(无论如何person只是返回一个字符串列表,而不是一个新类型。)另外,.它不是一个字段访问器,它只是一个方便的函数组合助手。

似乎您可能想要创建一种Person数据类型,例如

data Person = Person { firstName :: String, lastName :: String }

这是Person通过“记录语法”定义的。

现在,您可以编写一个接受 aPerson并返回其首字母的函数:

-- 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"))
于 2014-06-16T03:00:04.943 回答
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函数——它为输入“John”和“Doe”返回“John.Doe”,但我不明白这对打印首字母“JD”有什么用处。

于 2014-06-16T02:53:56.410 回答