タグ付けされた質問 「haskell」

関数型プログラミング言語


2
Haskellでエラーを報告する最もクリーンな方法
私はHaskellの学習に取り組んでおり、私が書いた関数のエラーに対処する3つの異なる方法に出くわしました。 単にerror "Some error message."例外をスローするように書くことができます。 私は自分の関数を返すMaybe SomeTypeことができます。私は返すものを返すことができる場合とできない場合があります。 関数を返すEither String SomeTypeことができます。エラーメッセージまたは最初に返されるように求められたものを返すことができます。 私の質問は、どのエラー処理方法を使用すればよいのか、そしてその理由は何ですか?コンテキストに応じて異なる方法を使用する必要がありますか? 私の現在の理解は: 純粋に機能的なコードの例外に対処するのは「困難」であり、Haskellでは、できる限り純粋に機能的なものに保ちたいと考えています。 Maybe SomeType関数が失敗または成功する場合(つまり、失敗する可能性のあるさまざまな方法がない場合)は、返すことが適切です。 Either String SomeType関数がさまざまな方法のいずれかで失敗する可能性がある場合、返すことは適切なことです。

1
Haskellに型レベルのラムダ抽象化がないのはなぜですか?
それにはいくつかの理論的な理由(型チェックや型推論が決定不能になるなど)か、実際的な理由(適切に実装するのが難しすぎる)がありますか? 現在、我々はに物事をラップすることができますnewtypeように newtype Pair a = Pair (a, a) そして、持っている Pair :: * -> * しかし、私たちのようなことはできませんλ(a:*). (a,a)。 (例えば、Scalaが持っているような、それらを持っているいくつかの言語があります。)

2
型チェックと再帰型(Haskell / OcamlでのYコンビネータの記述)
HaskellのコンテキストでYコンビネーターを説明するとき、通常、単純な実装は再帰型のためHaskellで型チェックを行わないことに注意されています。 たとえば、Rosettacodeから: The obvious definition of the Y combinator in Haskell canot be used because it contains an infinite recursive type (a = a -> b). Defining a data type (Mu) allows this recursion to be broken. newtype Mu a = Roll { unroll :: Mu a -> a } …

1
Mavenに似たHaskellビルドおよびアーティファクト環境
私は以前からJava開発者でしたが、最近、Haskellチームに参加しました。Javaの世界では、複数のチームが取り組んでいる大規模なプロジェクトがある場合、Mavenなどのアーティファクトサーバーを使用して開発を容易にし、スピードアップするのが一般的なアプローチです。Ant、Maven、Gradleなどの多数のビルドツールを使用してプロジェクトをビルドし、jarファイルをアーティファクトサーバーにアップロードして、チームの残りのメンバーが簡単に使用できます。したがって、プロジェクトをより小さなサブプロジェクトに分割することにより、ビルド時間も大幅に短縮されます。 Haskell側ではcabal、プロジェクトのビルドに使用しています。このプロジェクトは、最適化なしでビルドするのに約10〜15分かかります。コンパイラーの最適化がオンになっている場合、数時間かかりますが、これは苦痛です。 ここでJavaで行うのと同じことをどのように行うことができるのでしょうか。パッケージ(ライブラリ)のバイナリをコンパイルしてアーティファクトサーバーにアップロードし、ビルド時にビルド済みのバイナリを使用する簡単な方法はありますか?Haskellは(Javaのバイトコードではなく)マシンコードを生成するため、互換性の問題があるかもしれませんが、アーティファクトサーバーに格納されているアーキテクチャ/ OSごとに異なるバイナリを使用できる可能性があります。

2
haskellで「ディメンションを型にベイク」することは可能ですか?
ベクトルと行列を扱うライブラリを書きたいとします。ディメンションを型にベイクして、互換性のないディメンションの操作がコンパイル時にエラーを生成することは可能ですか? たとえば、ドット積の署名を次のようにしたい dotprod :: Num a, VecDim d => Vector a d -> Vector a d -> a ここで、d型には単一の整数値(これらのベクターの次元を表す)が含まれます。 これは、各整数に対して個別の型を(手で)定義し、それらをで呼ばれる型クラスにグループ化することで実現できると思いますVecDim。そのような型を「生成」するメカニズムはありますか? または、おそらく同じことを達成するためのより良い/簡単な方法はありますか?

3
haskellには依存型がありますか?
Haskellには別の型よりも型をパラメーター化する機能が既にあることは知っています(C ++のテンプレートプログラミングに似ています)が、Haskellは値に対して型をパラメーター化することもできますか?依存型では、サイズnのベクトル、サイズn×mの行列など、整数でパラメータ化された型を使用できます。 そうでない場合は、なぜですか?また、将来サポートされる可能性はありますか?
20 haskell 

3
関数型プログラミングで効率を改善する方法は?
私は最近、Learn You a Haskell for Great Goodガイドを読んでいますが、練習として、それを使ってProject Euler Problem 5を解決したかったです。 1から20までのすべての数値で均等に割り切れる最小の正の数値は何ですか? 最初に、特定の数がこれらの数で割り切れるかどうかを判断する関数を作成することにしました。 divisable x = all (\y -> x `mod` y == 0)[1..20] 次に、以下を使用して最小のものを計算しましたhead: sm = head [x | x <- [1..], divisable x] そして最後に、結果を表示する行を書きました: main = putStrLn $ show $ sm 残念ながら、これを完了するには約30秒かかりました。同じことを1〜10の数字で実行すると、すぐに結果が得られますが、その場合も1〜20の場合の結果よりもはるかに小さくなります。 Cで以前に解決し、1〜20の結果もほぼ瞬時に計算されました。これにより、この問題をHaskellで解釈する方法を誤解していると思うようになります。私は他の人の解決策に目を通し、これを見つけました: main = putStrLn $ show $ …
20 haskell 

4
Haskellは数学の基礎を教えるのが得意ですか?
ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 私は、ASやAレベルの数学仕様などの要件を持つクラスに数学を教えることに関与しています。 クラスの本は通常、数学のタスクに適用されるコンピューターソフトウェアの例を提供しますが、通常はmathlab、mathematica、derivateなどのソフトウェアアプリケーションに基づいています。 実際のプログラミング言語を使用する場合でも、通常はPascalなどの古い言語です。そして、これは私の意見では本当に悲しいです。 なぜなら、Haskellは数学に対する彼の気持ちで有名であり、私もそれに興味があるので、Haskellが大学1年生のエクステンション運動方法として良い選択かどうかを尋ねたいと思います。典型的な主題は、関数、計算、限界だけでなく、例えば線形代数でもあります。 私はプログラミング(c#、ruby、powershell、javascript、tex)で中級の知識経験があり、XSLTを使用した関数型プログラミングにもすでに取り組んでいます。 回答は責任をもって支持されます。線形代数(ベクトル空間など)、多項式、線形方程式の解法など、数学に適用されるHaskellコードの基本的な例を含む詳細な回答は、必要なものとして高く評価され、対象とされています。
19 haskell 

1
Haskell Webフレームワーク調査[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 Haskellには、Happstack、Snap、およびYesodのようないくつかのWebフレームワークがあり、おそらくさらにいくつかのフレームワークがあります。 それらはどのような点で互いに異なっていますか?例えば: 機能(例:サーバーのみ、またはクライアントスクリプト、さまざまな種類のデータベースの簡単なサポート) 成熟度(安定性、ドキュメントの品質など) スケーラビリティ(パフォーマンス、便利な抽象化など) 主なターゲット また、これらのフレームワークを使用した実世界のサイト/ Webアプリの例は何ですか? どうもありがとう。

4
永続性は純粋に機能的な言語にどのように適合しますか?
コマンドハンドラーを使用して永続性を処理するパターンは、IO関連のコードをできるだけ薄くしたい純粋に機能的な言語にどのように適合しますか? オブジェクト指向言語でドメイン駆動設計を実装する場合、コマンド/ハンドラーパターンを使用して状態の変更を実行するのが一般的です。この設計では、コマンドハンドラーはドメインオブジェクトの上に配置され、リポジトリの使用やドメインイベントの発行など、永続性に関連する退屈なロジックを担当します。ハンドラーは、ドメインモデルのパブリックフェイスです。UIなどのアプリケーションコードは、ドメインオブジェクトの状態を変更する必要があるときにハンドラーを呼び出します。 C#のスケッチ: public class DiscardDraftDocumentCommandHandler : CommandHandler<DiscardDraftDocument> { IDraftDocumentRepository _repo; IEventPublisher _publisher; public DiscardDraftCommandHandler(IDraftDocumentRepository repo, IEventPublisher publisher) { _repo = repo; _publisher = publisher; } public override void Handle(DiscardDraftDocument command) { var document = _repo.Get(command.DocumentId); document.Discard(command.UserId); _publisher.Publish(document.NewEvents); } } documentドメインオブジェクトは、((「あなたは既に破棄されていた文書を破棄することはできません」または「ユーザーが文書を破棄する権限を持つべきである」のような)ビジネスルールを実装するため、我々は公開する必要があるドメインイベントを発生させるための責任があるdocument.NewEventsだろうIEnumerable<Event>おそらく含まれていますDocumentDiscarded)イベントを。 これは素晴らしいデザインです-拡張が簡単で(ドメインモデルを変更せずに新しいコマンドハンドラーを追加することで新しいユースケースを追加できます)、オブジェクトの永続化方法に依存しません(MongoのNHibernateリポジトリを簡単に交換できます)リポジトリ、またはRabbitMQパブリッシャーをEventStoreパブリッシャーに交換します)これにより、偽物やモックを使用して簡単にテストできます。また、モデル/ビューの分離に従います-コマンドハンドラーは、バッチジョブ、GUI、またはREST APIのいずれで使用されているかわかりません。 Haskellのような純粋に機能的な言語では、おおよそ次のようにコマンドハンドラーをモデル化できます。 newtype CommandHandler = CommandHandler {handleCommand :: …

3
最も速い関数型言語
私は最近、特にHaskellとF#の関数型プログラミングを掘り下げてきました。いくつかのグーグルを回った後、より顕著な関数型言語(Scala、F#など)のベンチマーク比較を見つけることができませんでした。 一部の言語はハイブリッドであるため、必ずしも公平ではないことを知っています(Scalaが思い浮かびます)が、どの操作と全体でどのパフォーマンスが優れているかを知りたいだけです。

1
Haskellレコードの進捗はどうですか?
最近、私はHaskellの記録の問題、特にフィールド名の一意性に再び出会いました。(痛みです...) 私はすでに読んハスケル内のレコードのための提案を SPJとグレッグ・モリセットから、その最後の更新は2003年にされた 別の紙と呼ばれるHaskellのための軽量の拡張レコード SPJからとマーク・ジョーンズはさらに古いです:それは1999年にHaskellのワークショップからです。 Haskellに新しいレコードを提供するプロセスが進展したかどうかは疑問です。 誰かがそれについて何か知っていますか?

6
どの自己バランス型バイナリツリーをお勧めしますか?
私はHaskellを学び、演習としてバイナリツリーを作成しています。通常の二分木を作成したので、それを自己均衡化に適応させたいと思います。そう: どちらが最も効率的ですか? どちらが最も簡単に実装できますか? 最もよく使用されるのはどれですか? しかし、決定的に、どちらをお勧めしますか? これは議論の余地があるため、ここに属していると思います。

3
なぜ関数のタイプクラスがないのですか?
私がいじくり回してきた学習の問題で、適用、作成などの操作を行う関数の型クラスが必要であることに気付きました。理由... 関数の表現を関数そのものであるかのように扱うと便利な場合があります。そのため、関数の適用は暗黙的にインタープリターを使用し、関数の構成は新しい記述を導き出します。 関数の型クラスを取得したら、特別な種類の関数の型クラスを派生させることができます-私の場合、可逆関数が必要です。 たとえば、整数オフセットを適用する関数は、整数を含むADTで表すことができます。これらの関数を適用することは、整数を追加することを意味します。合成は、ラップされた整数を追加することにより実装されます。逆関数では、整数が否定されます。恒等関数はゼロをラップします。定数関数は、適切な表現がないため提供できません。 もちろん、値が本物のHaskell関数であるかのようにスペルする必要はありませんが、アイデアが得られたら、そのようなライブラリは既に存在し、おそらく標準のスペルを使用しているはずです。しかし、Haskellライブラリにはそのようなタイプクラスが見つかりません。 Data.Functionモジュールを見つけましたが、タイプクラスはありません-Preludeからも利用できる一般的な関数がいくつかあります。 だから-なぜ関数の型クラスがないのですか?「ないから」とか「思ったほど役に立たないから」?それとも、アイデアに根本的な問題があるのでしょうか? 私がこれまで考えていた最大の問題は、ループの問題を回避するために、実際の関数への関数の適用はおそらくコンパイラーによって特別に行われる必要があるということです。この関数を適用するには、関数適用関数を適用する必要があり、それを行うには、関数アプリケーション関数を呼び出す必要があります... より多くの手がかり 私が目指しているものを示すためのサンプルコード... {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} -- In my first version, Doable only had the one argument f. This version -- seemed to be needed to support the UndoableOffset type. -- -- It seems …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.