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

Haskellは、強力な静的型付け、遅延評価、広範な並列処理と同時実行のサポート、独自の抽象化機能を備えた関数型プログラミング言語です。

3
ghciがタイプリストとタイプファミリーを廃止するのはなぜですか?これを選択的に無効にできますか?
私のライブラリでghciが表示するタイプをできるだけ直感的にしようとしていますが、より高度なタイプ機能を使用すると、多くの困難に直面しています。 このコードがファイルにあるとしましょう: {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} import GHC.TypeLits data Container (xs::[*]) = Container それをghciにロードしてから、次のコマンドを入力します。 ghci> :t undefined :: Container '[String,String,String,String,String] 残念ながら、ghciは私にかなり醜い見た目を与えます: :: Container ((':) * String ((':) * String ((':) * String ((':) * String ((':) * String ('[] *)))))) ghciは型レベル文字列の砂糖を削除しました。ghciがこれをして、私にきれいなバージョンを与えるのを防ぐ方法はありますか? 関連するメモとして、タイプレベルのReplicate関数を作成するとします。 …
93 haskell  types  ghci 

3
カレーを利用するためのパラメータの順序付け
私は二回、最近のようなハックあまりにも多くのコードがあったので、パラメータの順序を変更するために、コードをリファクタリングしているflipかが\x -> foo bar x 42起こったが。 関数シグネチャを設計するとき、カレーを最大限に活用するのに役立つ原則は何ですか?


9
関数型プログラミング言語はどのように機能しますか?
関数型プログラミング言語が状態を保存できない場合、ユーザーからの入力を読み取るなどの単純なことをどのように実行しますか?入力をどのように「保存」するか(または、そのためのデータを保存するか)。 たとえば、この単純なCの事柄は、Haskellのような関数型プログラミング言語にどのように変換されますか? #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (私の質問は、この優れた投稿「名詞の王国での実行」に触発されました。これを読むと、オブジェクト指向プログラミングとは何か、Javaが1つの極端な方法でそれを実装する方法、および関数型プログラミング言語がどのように機能するかについて理解が深まりましたコントラスト。)

9
Haskell Preludeの「const」のポイントは何ですか?
Haskell Preludeを見ると、関数がある ことがわかりますconst。 const x _ = x この機能に関連するものを見つけることができないようです。 ポイントは何ですか?誰でもこの関数が使用される可能性のある場所の例を挙げられますか?
92 haskell 

3
mtl、transformers、monads-fd、monadLib、および選択したパラドックス
Hackageにはモナド変換のためのいくつかのパッケージがあります: mtl:モナド変換ライブラリ トランスフォーマー:コンクリートファンクターおよびモナドトランスフォーマー monads-fd:関数の依存関係を使用するモナドクラス monads-tf:タイプファミリーを使用するモナドクラス monadLib:モナド変換子のコレクション。 mtl-tf:タイプファミリーを使用するモナド変換ライブラリ。 mmtl:モジュラーモナド変換ライブラリ mtlx:タイプインデックス付きのモナド変換ライブラリ。「無料」のコピーを提供します。 compose-trans:合成可能なモナド変換子 (そしておそらく私はいくつかを逃した) どれを使用しますか? mtlはHaskellプラットフォームの1つですが、redditはクールではないと聞いています。 とにかく、選択の何が悪いのですか、それはただ良いことではありませんか? ええと、たとえば、データアクセサーの作成者がこれらすべてを、人気のある選択だけに応えるために作成しなければならない方法を見ました。 data-accessor-monadLibライブラリ:monadLibのモナドのアクセサ関数 data-accessor-monads-fdライブラリ:アクセサを使用してモナドfd状態モナドクラスの状態にアクセスする data-accessor-monads-tfライブラリ:アクセサーを使用してモナドtf状態モナドタイプファミリーの状態にアクセスする data-accessor-mtlライブラリ:Accessorを使用してmtl Stateモナドクラスの状態にアクセスする data-accessor-transformersライブラリ:アクセサーを使用してトランスフォーマーの状態モナドの状態にアクセスする これが続き、たとえばいくつかの競合するArrowパッケージが進化した場合、spoonklink-arrows-transformers、spoonklink-arrows-monadLib、spoonklink-tfArrows-transformers、spoonklink-tfArrows-monadLib、...のように見えるかもしれません。 そして、spoonklinkがフォークされると、Hackageがディスク領域を使い果たしてしまうのではないかと心配しています。:) 質問: なぜそれほど多くのモナド変換パッケージがあるのですか? なぜmtlはクールでないと考えられていますか? 主な違いは何ですか? これらの競合しているように見えるパッケージのほとんどは、Andy Gillが作成し、Ross Patersonが保守しています。これは、これらのパッケージが競合しているのではなく、何らかの方法で連携していることを意味しますか?AndyとRossは、独自のパッケージを廃止されたと見なしていますか? あなたと私はどちらを使うべきですか?

3
この難読化されたHaskellコードはどのように機能しますか?
https://en.uncyclopedia.co/wiki/Haskellを読んで(そして「攻撃的」なものをすべて無視して)、私は次の難読化されたコードに出会いました。 fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1 私はコードのその部分を実行するとghci(インポート後Data.FunctionとControl.Applicative)、ghci2のすべての権限のリストを出力します。 このコードはどのように機能しますか?
91 haskell 

3
状態、ST、IORef、MVarの違い
私は48時間でスキーマの作成に取り組んでいます(最大で約85 時間です)、変数と割り当ての追加に関する部分にたどり着きました。この章には大きな概念的なジャンプがあります。最終的なソリューションに直接ジャンプするのではなく、2つのステップで適切なリファクタリングを行って実行したいと思います。とにかく… :私は、同じ目的を果たすように見える別のクラスの数を失ってもらいましたState、ST、IORef、とMVar。最初の3つはテキストで言及されていますが、最後の3つは、最初の3つに関する多くのStackOverflowの質問に対する好ましい回答のようです。それらはすべて、連続した呼び出しの間に状態を運ぶようです。 これらはそれぞれ何であり、どのように互いに異なるのですか? 特に、次の文は意味がありません。 代わりに、状態スレッドと呼ばれる機能を使用して、Haskellに集約状態を管理させます。これにより、関数を使用して変数を取得または設定し、他のプログラミング言語と同様に可変変数を処理できます。 そして IORefモジュールを使用すると、IOモナド内でステートフル変数を使用できます。 これらすべてにより、行がtype ENV = IORef [(String, IORef LispVal)]混乱します-なぜ2番目IORefですか?type ENV = State [(String, LispVal)]代わりに書くと何が壊れますか?

4
ハスケルのべき乗
Haskell Preludeが2つの指数関数(つまり^と**)を定義している理由を誰かに教えてもらえますか?型システムはこの種の重複を排除することになっていると思いました。 Prelude> 2^2 4 Prelude> 4**0.5 2.0

15
HaskellでHaskellインタープリターを作成する
古典的なプログラミング演習は、Lisp / SchemeでLisp / Schemeインタープリターを作成することです。完全な言語の能力を活用して、言語のサブセットのインタープリターを作成できます。 Haskellにも同様の演習はありますか?Haskellをエンジンとして使用して、Haskellのサブセットを実装したいと思います。もちろんそれは可能ですが、見ることができるオンラインリソースはありますか? これがその裏話です。 私は、Haskellを言語として使用して、私が教えている離散構造コースのいくつかの概念を探求するという考えを模索しています。この学期では、Haskellに影響を与えた小さな言語であるMirandaに落ち着きました。ミランダは私がやりたいことの約90%をしますが、ハスケルは約2000%します。:) したがって、私の考えは、Haskellの機能を正確に備え、他のすべてを許可しない言語を作成することです。生徒が進むにつれて、基本を習得したら、さまざまな機能を選択的に「オン」にすることができます。 教育学的な「言語レベル」は、JavaとSchemeを教えるためにうまく使用されてきました。彼らができることを制限することによって、彼らがあなたが教えようとしている構文と概念をまだ習得している間、彼らが足で自分自身を撃つことを防ぐことができます。そして、あなたはより良いエラーメッセージを提供することができます。

2
Repaアレイの並列mapM
との最近の作業ではGibbs sampling、RVar乱数生成にほぼ理想的なインターフェースを提供するものを活用しています。残念ながら、マップでモナディックアクションを使用できないため、Repaを使用できませんでした。 明らかにモナディックマップは一般的に並列化できませんがRVar、効果を安全に並列化できるモナドの少なくとも1つの例である可能性があります(少なくとも原則として、私はの内部動作にあまり精通していませんRVar)。 。つまり、次のようなものを書きたいのですが、 drawClass :: Sample -> RVar Class drawClass = ... drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples どこにA.mapM似ているでしょう、 mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r …

3
現在の機能的リアクティブプログラミング実装のステータスは何ですか?
Haskellでいくつかの単純な自動物理システム(振り子、ロボットアームなど)を視覚化しようとしています。多くの場合、これらのシステムは次のような方程式で記述できます。 df/dt = c*f(t) + u(t) ここでu(t)、ある種の「インテリジェントコントロール」を表します。これらのシステムは、関数型リアクティブプログラミングパラダイムに非常にうまく適合しているように見えます。 そこで、Paul Hudak氏の著書「The Haskell School of Expression」を手に取ってみたところ、そこに提示されているドメイン固有言語「FAL」(Functional Animation Language)は、私の単純なおもちゃシステムでは非常にうまく機能していることがわかりましたintegrate。効率的に使用するには少し面倒すぎるようですが、簡単に修正できます)。 私の質問は、今日のより高度な、または実用的なアプリケーションのための、より成熟した、最新の、よく維持された、パフォーマンス調整された代替手段は何ですか? このWikiページにはHaskellのいくつかのオプションがリストされていますが、以下の点については明確ではありません。 (私が理解しているように)このプログラミングパラダイムの発明者の1人であるConal Eliottのプロジェクト「reactive」のステータスは、少し古く見えます。私は彼のコードが好きですが、多分私は他のより最新の代替案を試すべきですか?構文/パフォーマンス/実行時の安定性の点で、それらの主な違いは何ですか? 2011年の調査のセクション6 から引用すると、「... FRPの実装は、レイテンシの保証が必要なドメインで効果的に使用するには、まだ十分に効率的または予測可能ではありません...」。FRPが15年以上存在しているという事実を考えると、調査はいくつかの興味深い可能な最適化を示唆していますが、このパフォーマンスの問題は少なくとも数年以内に解決するのが非常に、または本質的に難しい場合があるという印象を受けます。これは本当ですか? 調査の同じ著者は彼のブログで「時間の漏れ」について語っています。問題はFRPに固有のものですか、それとも純粋で厳密でない言語でプログラミングするときに一般的に発生する問題ですか?FRPベースのシステムを長期間にわたって安定させることは、十分に高性能ではないにしても、非常に難しいと思ったことはありませんか? これはまだ研究レベルのプロジェクトですか?プラントエンジニア、ロボット工学エンジニア、金融エンジニアなどの人々が実際にそれらを使用していますか(ニーズに合った言語で)? 私は個人的にはHaskellの実装を好んでいますが、他の提案も受け入れています。たとえば、Erlangを実装するのは特に楽しいでしょう-インテリジェントで適応性のある、自己学習型のサーバープロセスを用意するのは非常に簡単です。

7
Haskellの厳格なポイントは何ですか?
Haskellがデフォルトで怠惰であることを私たちは皆知っています(または知っているはずです)。評価する必要があるまで、何も評価されません。それでは、いつ何かを評価する必要がありますか?Haskellが厳密でなければならない点があります。私はこれらを「厳格なポイント」と呼びますが、この特定の用語は思ったほど広くはありません。私によると: Haskellでの削減(または評価)は、厳密な点でのみ発生します。 だから問題は:Haskellの厳格なポイントは、正確には何ですか?私の直感ではmain、seq/ビッグバンパターン、パターンマッチング、およびIOを介しmainて実行されるすべてのアクションが主要な厳密ポイントであると述べていますが、なぜそれを知っているのか本当にわかりません。 (また、これらは「厳密ポイント」と呼ばれていない場合、何をしている彼らが呼ばれます?) 良い答えには、WHNFに関する議論などが含まれると思います。また、ラムダ計算に影響を与えるかもしれないと思います。 編集:この質問に関する追加の考え。 私がこの質問を反映したように、私は厳密さの点の定義に何かを追加するほうがより明確になると思います。厳密なポイントは、さまざまなコンテキストとさまざまな深さ(または厳密さ)を持つことができます。「Haskellでの削減は厳密なポイントでのみ発生する」という私の定義に戻り、その定義にこの句を追加しましょう:「厳密なポイントは、周囲のコンテキストが評価または削減されたときにのみトリガーされます」。 それで、私があなたに私が欲しい種類の答えから始めさせようと思います。main厳格なポイントです。これは、そのコンテキストの主要な厳格なポイントであるプログラムに特別に指定されています。プログラム(mainのコンテキスト)が評価されると、mainの厳密性ポイントがアクティブになります。メインの深さは最大です。完全に評価する必要があります。メインは通常、IOアクションで構成されます。IOアクションは厳密性のポイントでもあり、そのコンテキストはmainです。 seqでは、これらの用語でパターンマッチングについて話し合い、パターンマッチングを試してください。関数適用のニュアンスを説明してください:どのように厳密ですか?いかがですか?どうdeepseqですか?letとcaseステートメント?unsafePerformIO?Debug.Trace?トップレベルの定義?厳密なデータ型?バンパターン?等seqまたはパターンマッチングの観点から説明できるこれらの項目の数は?

5
レイジーI / Oの何が悪いのですか?
量産コードではレイジーI / Oの使用を避けるべきだと一般的に聞いています。私の質問は、なぜですか?いじるだけでなく、Lazy I / Oを使用しても問題ありませんか?そして、何が代替案(例えば列挙子)をより良くするのですか?

1
なぜこのHaskellコードは-Oで遅くなるのですか?
このHaskellコードは、を使用すると実行速度が大幅に低下しますが-O、危険で-Oはありません。誰が何が起こったのか教えてもらえますか?それが重要な場合は、この問題を解決する試みであり、バイナリ検索と永続セグメントツリーを使用します。 import Control.Monad import Data.Array data Node = Leaf Int -- value | Branch Int Node Node -- sum, left child, right child type NodeArray = Array Int Node -- create an empty node with range [l, r) create :: Int -> Int -> Node create l r | l …

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