gpt4 book ai didi

haskell - 将函数作为参数传递并返回函数 - Haskell

转载 作者:行者123 更新时间:2023-12-02 15:54:49 27 4
gpt4 key购买 nike

我有一个返回函数f(n)的图表

5  if n = 0 
2 if n = 1
-4 if n = 2
1 if n = 3
9 if n = 4
8 if n = 5
9 if n = 6
0 otherwise

我想编写一个函数来表示一个包含一个列表和对的图表:

type Nat0 = Int 
type Z = Int
type List = [Z]
type Graph = [(Nat0,Z)]

list_to_graph :: List -> Graph
list_to_graph x = list_to_graph' ([0..(length x)-1 ]) (x)

list_to_graph' :: [Int] -> List -> Graph
list_to_graph' (x:xs) (y:ys) = [(x, y)] ++ list_to_graph' (xs) (ys)
list_to_graph' [] [] = []

这就是我在这里所做的。传递列表 [5,2,-4,1,9,8,9] 返回

*Main> list_to_graph [5,2,-4,1,9,8,9]
[(0,5),(1,2),(2,-4),(3,1),(4,9),(5,8),(6,9)]

这是相反的函数:

graph_to_list :: Graph -> List
graph_to_list (x:xs) = [snd (x)] ++ graph_to_list(xs)
graph_to_list []= []

传递图形[(0,5),(1,2),(2,-4),(3,1),(4,9),(5,8),(6 ,9)]

*Main> graph_to_list [(0,5),(1,2),(2,-4),(3,1),(4,9),(5,8),(6,9)]
[5,2,-4,1,9,8,9]

问题:

我不明白如何写这样的东西:

type Function = (Nat0 -> Z) 

function_to_list :: Function -> List

list_to_function :: List -> Function

或图表相同

function_to_graph :: Function -> Graph
graph_to_function :: Graph -> Function

我已阅读Higher order functions在此链接上,但我似乎无法理解它实际上是如何工作的。

我想在 function_to_list 中,我必须传递一个具有此符号 (Nat0 -> Z) 的函数(实际上是 Int -> Int ),它应该返回一个带有 [Z] (即 [Int] )的 List 。但我该怎么做呢?这就像将相同的函数传递给自身一样?

更令人困惑的是 list_to_function 这里的结果应该是什么?

如果有人可以在我的一些示例中向我解释高阶函数,我将非常感激!

编辑:

更清楚地说,这是我想要实现的目标:

(list_to_graph . graph_to_list) = λ x. x
(graph_to_list . list_to_graph) = λ x. x

正如我上面所示,如果我将列表传递给 list_to_graph 它会返回一个图表,而 graph_to_list 则相反

(list_to_function . function_to_list) = λ x. x
(function_to_list . list_to_function) = λ x. x

这与我想要对其他两个函数执行的操作相同。如果我将 function_to_list 应用于 list_to_function,因为 function_to_list 返回一个 List 并且 list_to_function 接受List 它应该返回一个函数,该函数将从列表中取出元素并将其应用于 Function,该函数将返回 Z

我现在想到的:

function_to_list :: Function-> List
function_to_list f = [f(x) | x <- [0..6]]

function :: Function
function n
| n == 0 = 5
| n == 1 = 2
| n == 2 = (-4)
| n == 3 = 1
| n == 4 = 9
| n == 5 = 8
| n == 6 = 9
| otherwise = 0

正如下面的答案所建议的。

*Main> function_to_list function 
[5,2,-4,1,9,8,9]

我想做的是在我的list_to_function中创建这个function::Function

最佳答案

list_to_graph' :: [Int] -> List -> Graph
list_to_graph' (x:xs) (y:ys) = [(x, y)] ++ list_to_graph' (xs) (ys)
list_to_graph' [] [] = []

此函数存在,名为 zip

注意:zip 也适用于不同长度的列表,忽略较长列表的额外位,而如果两者长度不同,您的列表就会失败

graph_to_list :: Graph -> List
graph_to_list (x:xs) = [snd (x)] ++ graph_to_list(xs)
graph_to_list []= []

您可以将此函数编写为,

graph_to_list = map snd

graph_to_list xs = [snd x | x <- xs]

graph_to_list xs = [a | (a,b) <- xs]

关于这一点,

What I dont understand is how to write something like this:

type Function = (Nat0 -> Z) 

function_to_list :: Function -> List

如果我理解正确的话,您希望能够构建“f 的图像”,即所有 x 的所有值 f x 的列表f的域中。理论上可能看起来像,

[f(x) | x <- DOMAIN f]

然而,一般来说,没有办法知道给定函数的域(更不用说遍历它的方法了)。将函数转换为图形也是如此。要实现此类“转换”,您必须提供函数 f::A -> B 和列表 xs::A 作为参数,其中包含其域的点你要考虑一下。

关于haskell - 将函数作为参数传递并返回函数 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53573671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com