タグ付けされた質問 「functional-programming」

関数型プログラミングは、関数を使用して抽象化を構築し、副作用や状態の変化を回避することに基づくプログラミングパラダイムです。純粋な関数型プログラミングはスレッドセーフです。


1
「オプション」のファンラーホーフェン表現はありますか
多くのタイプの光学系には、ファンラーホーフェンの表現があります。 たとえばLens、タイプのa は次のLens s t a b ように表すことができます。 Functor f => (a -> f b) -> s -> f t 同様にTraversal、は同様の方法で表すことができ、Functor制約をApplicative次のように入れ替えます。 Applicative f => (a -> f b) -> s -> f t MonocleやArrowなどのいくつかの光学フレームワークは、というタイプを定義しますOptional。 Monocleの光学では、階層 OptionalはLensとの間に適合しますTraversal 私が理解しているように:a Traversalが0から多くのターゲットをLens持つ可能性がある aのような場合、は0から1のターゲットを持つ可能性があるOptional aのようなものです。Lens Monocleでは、Optional関数のペアとして定義されます。 getOrModify :: s -> Either t a set :: …

3
折りたたみ後の後処理ステップなしでこの単語機能を実装することは可能ですか?
印刷物のReal World Haskell、第4章、98ページでは、words折りたたみを使用して実装できるかどうかを尋ねられますが、これも私の質問です。 出来ますか?そうでない場合、なぜですか?もしそうなら、どうですか? 私は次のことを思いつきました、これは各非スペースが出力リストの最後の単語の前に追加されるべきであるという考えに基づいています(これはotherwiseガードで発生します)、そして空白は空の単語の追加をトリガーするべきであるという考えに基づいています出力リストがまだ存在しない場合(これがで取り扱われますif- - )。thenelse myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | otherwise = (x:y):ys 入力文字列の先頭にスペースがあると、文字列の出力リストに1つの空の文字列が先行するため、このソリューションは間違いです。 上記のリンクで、私は他の読者のために提案された解決策のいくつかを調べました、そしてそれらの多くは私の解決策と同様に動作しますが、それらは一般的に、例えば、tailもしあるならそれを空の先行文字列です。 他のアプローチはタプル(実際にはペアのみ)を使用するため、フォールドはペアを処理し、先頭/末尾のスペースを適切に処理できます。 これらすべてのアプローチfoldr(または別のフォールド、fwiw)は、箱から出して最終的な出力を提供する関数ではありません。なんとかして出力を調整しなければならない何かが常にあります。 したがって、私は最初の質問に戻って、words折りたたみを使用して(末尾/先頭/繰り返しのスペースを正しく処理する方法で)実際に実装できるかどうかを尋ねます。折り目を使用して、私は折りたたみ機能は、最も外側の関数でなければならないことを意味します。 myWords :: String -> [String] myWords …

1
Scala Cats / fs2でスタックの安全性を推論する方法は?
以下はfs2のドキュメントからのコードの一部です。関数goは再帰的です。問題は、それがスタックセーフであるかどうかをどのように知るか、および関数がスタックセーフかどうかをどのように推論するかです。 import fs2._ // import fs2._ def tk[F[_],O](n: Long): Pipe[F,O,O] = { def go(s: Stream[F,O], n: Long): Pull[F,O,Unit] = { s.pull.uncons.flatMap { case Some((hd,tl)) => hd.size match { case m if m <= n => Pull.output(hd) >> go(tl, n - m) case m => Pull.output(hd.take(n.toInt)) >> Pull.done } case None …

2
Java8でのデータのリストのクリーニング
データのリストをクリーニングするために、データのリストと実行するクリーニング操作のリストを受け入れるメソッドを作成しました。 public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) { List<T>dataNew=data.stream().map((str) -> { T cleanData = str; for(Function<T,T> function:cleanOps) { cleanData=function.apply(cleanData); } return cleanData; }).collect(Collectors.toList()); return dataNew; } ここでの問題Collectors.toList()は、新しいリストを返すため、リスト全体を再度作成することです。余分なスペースを使用せずに同じ結果を得ることができますか? 以下は、呼び出し用のコードです。 public void processData() { List<Function<String, String>> cleanOps = new ArrayList<>(); cleanOps.add(String::toLowerCase); cleanOps.add(str -> str.replaceAll(" ", "")); List<String> data = new …

5
printlnが不純な関数と見なされるのはなぜですか?
私は本のプログラミングをscalaで読んでいて、こう言われています: ...この場合、その副作用は標準出力ストリームへの出力です。 そして、私は副作用がどこにあるのかわかりません、なぜなら同じ入力に対して、printlnは同じ出力を出力するからです(私は思う) UPDATE を呼び出すときはいつでも: println(5) それが印刷されます5私が呼び出す場合表示されていない、println(5)5以外の値を出力しますが!

2
「パイプ」されたES6関数のJSDocを生成する方法
で関数構成を使用して定義されたES6スタイルの関数がありasyncPipeます。 import { getItemAsync } from 'expo-secure-store'; const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x); const getToken = () => getItemAsync('token'); const liftedGetToken = async ({ ...rest }) => ({ token: await getToken(), ...rest, }); const liftedFetch = ({ body, route, token, method = …

1
Haskellsウィークヘッドノーマルフォーム
私はいくつかのイライラするものにつまずきました。私はhaskellが弱い頭の正規形(WHNF)で機能することを知っており、これが何であるかを知っています。次のコードをghciに入力します(私の知識では、式をWHNFに削減する:sprintコマンドを使用しています)。 let intlist = [[1,2],[2,3]] :sprint intlist 与えintlist = _これますが、完全に私には意味。 let stringlist = ["hi","there"] :sprint stringlist 与えstringlist = [_,_] これは、すでに私を混乱させる。しかしその後: let charlist = [['h','i'], ['t','h','e','r','e']] :sprint charlist 意外と与える charlist = ["hi","there"] 私がHaskellを理解している限り、文字列は文字のリストに他なりません。これは、型"hi" :: [Char]とを確認することで確認できます['h','i'] :: [Char]。 私の理解では、上記の3つの例はほぼ同じ(リストのリスト)であり、したがって同じWHNF、つまり_に削減する必要があるため、混乱しています。何が欠けていますか? ありがとう

6
POJOでパブリックプロパティのゲッター/セッターを複製する方法
〜60個のプロパティで自動生成されるPOJOがあります。これは、ゲッター/セッターを含まないavro 1.4で生成されます。 オブジェクト間の単純な変換を提供するために使用するライブラリは、適切に機能するためにゲッター/セッターのようなメソッドを必要とします。 POJOを手動でオーバーライドしてすべてのゲッター/セッターを手動で作成せずにゲッター/セッターを複製する方法はありますか? public class BigGeneratedPojo { public String firstField; public int secondField; ... public ComplexObject nthField; } public class OtherObject { private String reprOfFirstFieldFromOtherObject; private ComplexObject reprOfFirstFieldFromOtherObject; public String getReprOfFirstFieldFromOtherObject() { ... standard impl ... }; public void setReprOfFirstFieldFromOtherObject() { ... standard impl ... }; } 欲望は次のようなコードを書くことです: Mapper<BigGeneratedPojo, …

1
contではできないcallCCで何ができますか?
私は本当に本当にcallCCを理解するのに苦労しています。私は継続の力を得て、いくつかのプロジェクトでこのコンセプトを使用して、クールなコンセプトを作成しています。しかし、私よりも優れた機能を使用する必要はありませんでしたcont :: ((a->r)->r)-> Cont r a。 それを使用した後、彼らがCont Monadをすべてのモナドの母と呼んでいる理由はよくわかりますが、私はいつ使用する必要があるのか​​わかりませんcallCC。

2
ステートフルオブジェクトの構築は、エフェクトタイプでモデル化する必要がありますか?
Scalaやのような関数環境を使用する場合cats-effect、ステートフルオブジェクトの構築はエフェクトタイプでモデル化する必要がありますか? // not a value/case class class Service(s: name) def withoutEffect(name: String): Service = new Service(name) def withEffect[F: Sync](name: String): F[Service] = F.delay { new Service(name) } 構造は間違いがないので、のような弱い型クラスを使用できますApply。 // never throws def withWeakEffect[F: Applicative](name: String): F[Service] = new Service(name).pure[F] これらはすべて純粋で確定的だと思います。結果のインスタンスは毎回異なるため、参照透過的ではありません。エフェクトタイプを使うのにいい時ですか?または、ここで異なる機能パターンがあるでしょうか?

3
Haskellでのリストの三角形化
triangularize :: [a] -> [[a]](おそらく無限の)リストを取り、それをリストのリストに「三角形化」する効率的なHaskell関数を書くことに興味があります。たとえば、triangularize [1..19]返す必要があります [[1, 3, 6, 10, 15] ,[2, 5, 9, 14] ,[4, 8, 13, 19] ,[7, 12, 18] ,[11, 17] ,[16]] 効率的には、リストの長さがO(n)どこにあるのかを実行することを意味しnます。 リスト(配列)の末尾への追加は一定時間の操作であるため、これはPythonなどの言語で非常に簡単に実行できることに注意してください。これを実現する非常に命令的なPython関数は次のとおりです。 def triangularize(elements): row_index = 0 column_index = 0 diagonal_array = [] for a in elements: if row_index == len(diagonal_array): diagonal_array.append([a]) else: diagonal_array[row_index].append(a) if …


2
ストリームパイプラインでのデータベースへの保存
オラクルのウェブサイトのドキュメントによると: ストリーム操作に対する動作パラメータの副作用は、一般に推奨されません。これらは、無意識の要件の意図しない違反や、その他のスレッドセーフティの危険につながることが多いためです。 これには、ストリームの要素をデータベースに保存することも含まれますか? 次の(疑似)コードを想像してみてください。 public SavedCar saveCar(Car car) { SavedCar savedCar = this.getDb().save(car); return savedCar; } public List<SavedCars> saveCars(List<Car> cars) { return cars.stream() .map(this::saveCar) .collect(Collectors.toList()); } この実装に対抗する望ましくない影響は何ですか? public SavedCar saveCar(Car car) { SavedCar savedCar = this.getDb().save(car); return savedCar; } public List<SavedCars> saveCars(List<Car> cars) { List<SavedCars> savedCars = new ArrayList<>(); for …

5
他の純関数に委譲する共用体型で純関数をテストする
共用体型を取り、その型を絞り込み、他の2つの純粋関数のいずれかに委任する関数があるとします。 function foo(arg: string|number) { if (typeof arg === 'string') { return fnForString(arg) } else { return fnForNumber(arg) } } fnForString()およびfnForNumber()も純粋な関数であり、それらはすでにテスト済みであると想定します。 どのようにテストを行うべきfoo()ですか? あなたはそれに委譲しているという事実扱うべきであるfnForString()とfnForNumber()のためのテストを書くときに、本質的に、実装の詳細など、及びそれらのそれぞれのテストを複製するのfoo()?この繰り返しは受け入れられますか? あなたは、「知っている」のテスト書くべきfoo()にデリゲートをfnForString()し、fnForNumber()それらをからかっし、それらへの委譲ことをチェックすることにより、例えば?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.