関数をパラメーターとして渡し、関数を返す-Haskell

チェシャー

私は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 

そして、ペアを持つ1つのリストを持つグラフを表す関数を書きたかったのです。

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

このリンクで高階関数を読みましたが、これが実際にどのように機能するのか理解できないようです。

function_to_listこの表記(Nat0 -> Z)(実際にはInt -> Intを持つ関数を渡す必要があり、Listwith [Z](これは[Int]返す必要あると思いますしかし、どうすればそれを行うことができますか?それは同じ関数をそれ自体に渡すようなものですか?

さらに紛らわしいのは、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

他の2つの関数でやりたいことと同じです。asに適用function_to_listlist_to_functionfunction_to_lista返し、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]

私がしたいのfunction :: Functionは私の中でこれを作ることですlist_to_function

ルキ

だからあなたは取得しようとしています

list_to_function :: List -> Function

正しい?Graph代わりにやってみましょう、それは本質に近づくでしょう。それを書き始めましょう。

graph_to_function gph = _ -- something of type Function

したがって、タイプの何かFunction、つまり、を構築したいと思いNat0 -> Zます。それを行う最も退屈な方法は、ラムダを使用することです。

graph_to_function gph = \n -> _ -- something of type Z

グレートは、今、私たちは持っているGraphと呼ばれるgphNat0呼ばれるn、と私たちは作りたいですZここでは、リストでを検索できnます。これを行うにはいくつかの方法があります。これが1つです。

graph_to_function gph = \n -> head ([ y | (x,y) <- gph, x == n ] ++ [0])

++ [0]リスト内包表記が空になった場合、つまりnグラフのドメインで見つからなかった場合に備えて、最後に付けました完了!

面白いことに、Haskellの関数はデフォルトでカレーされているので

f x y z = ...
f = \x -> \y -> \z -> ...

同等です。つまり、これはgraph_to_function2つの引数の関数とまったく同じです。したがってn、定義の左側に移動できます。

graph_to_function :: Graph -> Function
graph_to_function gph n = head ([ y | (x,y) <- gph, x == n ] ++ [0])

署名に1つの引数だけが方程式の2つの引数であるのは少し奇妙に見えますが、慣れると実際に見られるものです。

お役に立てれば!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Haskellを使用して関数パラメーターを制限する方法は?

分類Dev

Haskell:関数リストパラメータの各要素に対して関数を実行します

分類Dev

マップを使用して複数のパラメーターを持つ関数を呼び出すHaskell

分類Dev

haskellの関数パラメーターでリストをどのように渡しますか?

分類Dev

パラメータなしでHaskell関数を書く方法は?

分類Dev

Haskell。この関数はどのようにして負の数をパラメーターとしてキャッチしますか?

分類Dev

Haskell:関数を引数として渡すときの剛体型変数エラー

分類Dev

2つのパラメーターを使用して再帰関数の初期条件を設定する方法(Haskell)

分類Dev

Haskellの関数パラメータとしてのタプルのリスト

分類Dev

Haskell関数のパラメーターを理解する方法

分類Dev

Haskellで関数を取得して、データ型を使用して複数の型を返す方法は?

分類Dev

Haskellの関数がジェネリック型パラメーターを取得していません

分類Dev

パラメータなしのhaskell関数のWhere句

分類Dev

Haskell関数型プログラミング、パラメーターとして機能

分類Dev

複数のパラメーターを持つHaskellフィルター関数

分類Dev

Haskell-任意の関数と引数リストを引数として別の関数に渡します

分類Dev

関数を関数パラメーターとして渡す

分類Dev

Haskellインライン関数を引数として渡すことはできますか?

分類Dev

haskell:高階関数を使用してエラーを解析します

分類Dev

整数を返すHaskell関数

分類Dev

値を出力して返すhaskell関数を作成する

分類Dev

Haskellのさまざまなタイプに引数として渡された関数を適用する

分類Dev

関数の変数としてのHaskellコンストラクター

分類Dev

Haskellのパターンとしてパラメータを使用する

分類Dev

Haskell関数のパラメーターの数

分類Dev

init関数とlast関数を使用してhaskell再帰コードを理解する

分類Dev

mapとfoldr、haskellを使用して関数を実装します

分類Dev

Haskellの適用ファンクターの(<*>)関数をよりよく理解しようとしています

分類Dev

Haskellの適用ファンクターの(<*>)関数をよりよく理解しようとしています

Related 関連記事

  1. 1

    Haskellを使用して関数パラメーターを制限する方法は?

  2. 2

    Haskell:関数リストパラメータの各要素に対して関数を実行します

  3. 3

    マップを使用して複数のパラメーターを持つ関数を呼び出すHaskell

  4. 4

    haskellの関数パラメーターでリストをどのように渡しますか?

  5. 5

    パラメータなしでHaskell関数を書く方法は?

  6. 6

    Haskell。この関数はどのようにして負の数をパラメーターとしてキャッチしますか?

  7. 7

    Haskell:関数を引数として渡すときの剛体型変数エラー

  8. 8

    2つのパラメーターを使用して再帰関数の初期条件を設定する方法(Haskell)

  9. 9

    Haskellの関数パラメータとしてのタプルのリスト

  10. 10

    Haskell関数のパラメーターを理解する方法

  11. 11

    Haskellで関数を取得して、データ型を使用して複数の型を返す方法は?

  12. 12

    Haskellの関数がジェネリック型パラメーターを取得していません

  13. 13

    パラメータなしのhaskell関数のWhere句

  14. 14

    Haskell関数型プログラミング、パラメーターとして機能

  15. 15

    複数のパラメーターを持つHaskellフィルター関数

  16. 16

    Haskell-任意の関数と引数リストを引数として別の関数に渡します

  17. 17

    関数を関数パラメーターとして渡す

  18. 18

    Haskellインライン関数を引数として渡すことはできますか?

  19. 19

    haskell:高階関数を使用してエラーを解析します

  20. 20

    整数を返すHaskell関数

  21. 21

    値を出力して返すhaskell関数を作成する

  22. 22

    Haskellのさまざまなタイプに引数として渡された関数を適用する

  23. 23

    関数の変数としてのHaskellコンストラクター

  24. 24

    Haskellのパターンとしてパラメータを使用する

  25. 25

    Haskell関数のパラメーターの数

  26. 26

    init関数とlast関数を使用してhaskell再帰コードを理解する

  27. 27

    mapとfoldr、haskellを使用して関数を実装します

  28. 28

    Haskellの適用ファンクターの(<*>)関数をよりよく理解しようとしています

  29. 29

    Haskellの適用ファンクターの(<*>)関数をよりよく理解しようとしています

ホットタグ

アーカイブ