访问已调用的函数
Accessing a function, that has been called
我目前正在尝试找出一种编写 "telephone book" 的方法。 (这是大学的一项任务,所以我希望得到提示而不是完整的解决方案)
我创建了一个函数,使用户可以编写如下多个名称:
(必须这样解决,因为我们必须使用type TelephoneBook = String -> String
)
(enterName "Peter" "4232" (enterName "Alice" "23213" emptyBook)) ""
这将 return Peter
。
好吧,现在我应该能够访问这些数据并搜索姓名,然后检索号码。
我目前的想法是:
searchFkt :: String -> TelephoneBook -> String
searchFkt a b
| (a == book "") = a --Iam fully aware that this doesn't work
| otherwise = "not found"
我知道第二部分不是那样工作的(也给出了 searchFkt :: String -> TelephoneBook -> String
),但是我不知道如何实现它,我真的需要帮助,因为我一直在寻找翻阅书籍,花几个小时努力思考如何解决这个问题。
提前致谢
Ps:我想了解它是如何工作的,而不仅仅是找到一个解决方案,所以也许参考阅读的内容也会有所帮助:)
鉴于您说 Telephonebook
是类型别名 String -> String
,我认为您想要编写一个将名称映射到电话号码的函数。因此,如果您从书中查找 "Peter"
,它会 returns "4232"
.
现在如果你想搜索一个名字,你所要做的就是拨打电话簿上的查询。所以 searchFkt
看起来像:
searchFkt :: String -> Telephonebook -> String
searchFkt query book = book query
尽管如此,根据您的评论,我认为您在 enterName
程序中犯了一个错误。 你说你把它实现为:
putName :: String -> String -> Telephonebook -> Telephonebook
putName name number oldbook = \x -> number
(我冒昧地重命名了a
、b
和c
)。如您所见,表达式右侧甚至没有提到 name
和 oldbook
。结果 Haskell 忘记了这些:这意味着 name
和 oldbook
都没有参与新书的构建。
更好的方法是将其实现为:
putName :: String -> String -> Phonebook -> Phonebook
putName name number oldbook = newbook
where newbook query | query == name = number
| otherwise = oldbook query
换句话说,您构建了一个新函数 newbook
,它将 query
(您应该解析的名称)作为输入。如果 query
等于给定的新 name
,它 returns 就是 number
;否则它要求 oldbook
进一步处理它。
最后我认为将电话簿实现为一个函数并不是一个好主意String -> String
,因为下一个任务可能是实现反向查找操作,在这种情况下你就迷路了。最好将其实现为像[(String,String)]
这样的元组列表(当然hashmaps等会更理想)。
这本身并不是一个答案,而是试图澄清您的任务似乎是什么,既是为了您自己,也是为了其他试图阅读您问题的人。
您的作业的最终目标似乎是使用函数实现 phone 一本书; hard-coded 示例可能是
type TelephoneBook = String -> String
myPhoneBook :: TelephoneBook
myPhoneBook "Peter" = "4232"
myPhoneBook "Alice" = "23213"
请注意,这只是部分功能;对于绝大多数可能的名称,它根本没有定义。
这种方法的一个问题是它不允许真正空的 phone 书,因为您不能定义实际上不做 任何事情的函数。因此,我们将用 "empty" 本书替换它 returns phone 书中没有的任何名称的默认值:
-- Not ideal, but it's the best we can do given the constraints
-- imposed by the given type.
empty :: TelephoneBook
empty _ = "not found"
你的目标是编写一个函数 enterName
,它接受一个名字、一个 phone 数字和一本 existing phone 书,和 returns 一本新的 phone 书,与旧书相同,但有一个新条目(覆盖任何以前同名的条目。也就是说,
empty "Peter" == "not found"
(enterName "Peter" "1234" empty) "Peter" == "1234"
(enterName "Peter" "1234" empty) "Bob" == "not found"
(enterName "Bob" "9876" (enterName "Peter" "1234" empty)) "Bob" == "9876"
您的 enterName
函数的类型为 String -> String -> TelephoneBook -> TelephoneBook
,这意味着它需要三个参数,并且它需要对所有三个参数进行实际操作。
enterName :: String -> String -> TelephoneBook -> TelephoneBook
enterName name number phonebook = ...
同样,您的 searchFkt :: String -> TelephoneBook -> String
函数接受一个名字和一本 phone 书以及 returns 书中与该名字关联的编号。
searchFkt :: String -> TelephoneBook -> String
searchFkt name book = ...
鉴于上面TelephoneBook
的定义和它的使用示例,应该很明显如何实现searchFkt
。
我目前正在尝试找出一种编写 "telephone book" 的方法。 (这是大学的一项任务,所以我希望得到提示而不是完整的解决方案)
我创建了一个函数,使用户可以编写如下多个名称:
(必须这样解决,因为我们必须使用type TelephoneBook = String -> String
)
(enterName "Peter" "4232" (enterName "Alice" "23213" emptyBook)) ""
这将 return Peter
。
好吧,现在我应该能够访问这些数据并搜索姓名,然后检索号码。 我目前的想法是:
searchFkt :: String -> TelephoneBook -> String
searchFkt a b
| (a == book "") = a --Iam fully aware that this doesn't work
| otherwise = "not found"
我知道第二部分不是那样工作的(也给出了 searchFkt :: String -> TelephoneBook -> String
),但是我不知道如何实现它,我真的需要帮助,因为我一直在寻找翻阅书籍,花几个小时努力思考如何解决这个问题。
提前致谢
Ps:我想了解它是如何工作的,而不仅仅是找到一个解决方案,所以也许参考阅读的内容也会有所帮助:)
鉴于您说 Telephonebook
是类型别名 String -> String
,我认为您想要编写一个将名称映射到电话号码的函数。因此,如果您从书中查找 "Peter"
,它会 returns "4232"
.
现在如果你想搜索一个名字,你所要做的就是拨打电话簿上的查询。所以 searchFkt
看起来像:
searchFkt :: String -> Telephonebook -> String
searchFkt query book = book query
尽管如此,根据您的评论,我认为您在 enterName
程序中犯了一个错误。
putName :: String -> String -> Telephonebook -> Telephonebook
putName name number oldbook = \x -> number
(我冒昧地重命名了a
、b
和c
)。如您所见,表达式右侧甚至没有提到 name
和 oldbook
。结果 Haskell 忘记了这些:这意味着 name
和 oldbook
都没有参与新书的构建。
更好的方法是将其实现为:
putName :: String -> String -> Phonebook -> Phonebook
putName name number oldbook = newbook
where newbook query | query == name = number
| otherwise = oldbook query
换句话说,您构建了一个新函数 newbook
,它将 query
(您应该解析的名称)作为输入。如果 query
等于给定的新 name
,它 returns 就是 number
;否则它要求 oldbook
进一步处理它。
最后我认为将电话簿实现为一个函数并不是一个好主意String -> String
,因为下一个任务可能是实现反向查找操作,在这种情况下你就迷路了。最好将其实现为像[(String,String)]
这样的元组列表(当然hashmaps等会更理想)。
这本身并不是一个答案,而是试图澄清您的任务似乎是什么,既是为了您自己,也是为了其他试图阅读您问题的人。
您的作业的最终目标似乎是使用函数实现 phone 一本书; hard-coded 示例可能是
type TelephoneBook = String -> String
myPhoneBook :: TelephoneBook
myPhoneBook "Peter" = "4232"
myPhoneBook "Alice" = "23213"
请注意,这只是部分功能;对于绝大多数可能的名称,它根本没有定义。
这种方法的一个问题是它不允许真正空的 phone 书,因为您不能定义实际上不做 任何事情的函数。因此,我们将用 "empty" 本书替换它 returns phone 书中没有的任何名称的默认值:
-- Not ideal, but it's the best we can do given the constraints
-- imposed by the given type.
empty :: TelephoneBook
empty _ = "not found"
你的目标是编写一个函数 enterName
,它接受一个名字、一个 phone 数字和一本 existing phone 书,和 returns 一本新的 phone 书,与旧书相同,但有一个新条目(覆盖任何以前同名的条目。也就是说,
empty "Peter" == "not found"
(enterName "Peter" "1234" empty) "Peter" == "1234"
(enterName "Peter" "1234" empty) "Bob" == "not found"
(enterName "Bob" "9876" (enterName "Peter" "1234" empty)) "Bob" == "9876"
您的 enterName
函数的类型为 String -> String -> TelephoneBook -> TelephoneBook
,这意味着它需要三个参数,并且它需要对所有三个参数进行实际操作。
enterName :: String -> String -> TelephoneBook -> TelephoneBook
enterName name number phonebook = ...
同样,您的 searchFkt :: String -> TelephoneBook -> String
函数接受一个名字和一本 phone 书以及 returns 书中与该名字关联的编号。
searchFkt :: String -> TelephoneBook -> String
searchFkt name book = ...
鉴于上面TelephoneBook
的定义和它的使用示例,应该很明显如何实现searchFkt
。