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

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

4
Haskellには末尾再帰最適化がありますか?
今日、UNIXで「time」コマンドを発見し、Haskellの末尾再帰関数と通常の再帰関数のランタイムの違いを確認するのに使用すると思いました。 私は以下の関数を書きました: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 facSlow x = x * …

7
コンパイラを関数型言語で書く方が簡単なのはなぜですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 2年前休業。 この質問を改善する 私はこの質問について長い間考えていましたが、Googleでの答えもStackoverflowでの同様の質問も実際には見つかりませんでした。重複している場合は、ごめんなさい。 多くの人は、OCamlやHaskellなどの関数型言語でコンパイラやその他の言語ツールを書く方が、命令型言語で書くよりもはるかに効率的で簡単だと言っているようです。 これは本当ですか?そして、もしそうなら、なぜCのような命令型言語ではなく関数型言語で書くのが、なぜそんなに効率的で簡単なのでしょうか?また、関数型言語の言語ツールは、Cのような低水準言語よりも遅くありませんか?

5
上位の型はいつ役立つのですか?
私はしばらくF#で開発を行っており、気に入っています。しかし、私がF#に存在しないことを知っている流行語の1つは、種類の高い型です。種類の多い資料を読んだことがあり、その定義を理解していると思います。それらがなぜ有用なのか、私にはわかりません。誰かが、F#での回避策を必要とする、ScalaまたはHaskellで種類の高いものが簡単にできる例をいくつか提供できますか?また、これらの例では、種類の高い型がない場合(またはF#で逆の場合)の回避策は何ですか?多分私はそれを回避するのに慣れているので、その機能がないことに気付かないでしょう。 (私は思います)私はmyList |> List.map f、myList |> Seq.map f |> Seq.toListより高い種類の型の代わりに、単純に書くmyList |> map fことができ、それがを返すと思いますList。(それが正しいと仮定して)それは素晴らしいですが、ちょっとささいなことですか?(そして、関数のオーバーロードを許可するだけでそれを行うことはできませんでしたか?)私は通常、Seqとにかく変換し、その後、必要なものに変換できます。繰り返しますが、多分私はそれを回避するのに慣れすぎています。しかし、より種類の高いタイプがキーストロークまたはタイプセーフのいずれかで本当にあなたを救う例はありますか?

2
直観主義型理論に相当するコンビネータ論理とは何ですか?
私は最近、HaskellとAgda(依存型関数型プログラミング言語)を取り上げた大学のコースを修了しましたが、これらのラムダ計算をコンビネータ論理に置き換えることができるかどうか疑問に思いました。Haskellでは、これはSおよびKコンビネータを使用して可能であるように思われるため、ポイントフリーになります。アグダに相当するものは何だろうと思っていました。つまり、変数を使用せずに、依存型の関数型プログラミング言語をAgdaと同等にすることはできますか? また、どういうわけか定量化をコンビネータに置き換えることは可能ですか?これが偶然かどうかはわかりませんが、たとえば全称記号を使用すると、型シグネチャがラムダ式のように見えます。意味を変えずに型シグネチャから全称記号を削除する方法はありますか?例: forall a : Int -> a < 0 -> a + a < a フォラルを使わなくても同じことが表現できますか?

6
Haskellのドット演算子:詳細な説明が必要
私はこのHaskellコードでドット演算子が何をしているのかを理解しようとしています: sumEuler = sum . (map euler) . mkList ソースコード全体は以下のとおりです。 私の理解 ドット演算子は、2つの関数sumとの結果map eulerおよびの結果をmkList入力として受け取ります。 しかし、sum関数ではなく、関数の引数ですよね?では、ここで何が起こっているのでしょうか? また、何をし(map euler)ているのですか? コード mkList :: Int -> [Int] mkList n = [1..n-1] euler :: Int -> Int euler n = length (filter (relprime n) (mkList n)) sumEuler :: Int -> Int sumEuler = sum . (map …


1
esqueletoでSQL文字列を生成するにはどうすればよいですか?
esqueletoを取得してfromステートメントからSQL文字列を生成するにはどうすればよいですか? のドキュメントにtoRawSqlは、「永続のクエリログをオンにするだけでよい」と書かれています。MonadLogger理解できるすべての可能な形式を試しましたが、SQLが出力されませんでした。同じドキュメントには、「この関数を手動で使用することは可能ですが、面倒です」とも記載されています。ただし、その型のコンストラクターも、その型の値を返す関数QueryTypeもエクスポートされません。私QueryTypeはそれがであることに気づきnewtype、使用することによってこれを回避することができましたunsafeCoerce! またConnection、SQLを生成するためにデータベースに接続する必要はないはずですが、(SQLiteを介して取得した)を提供することを余儀なくされました。 これは私が持っているものです。より良い方法があるに違いありません。 withSqliteConn ":memory:" $ \conn -> return $ toRawSql SELECT (unsafeCoerce ((const mempty) :: a -> Text.Lazy.Builder.Builder)) (conn, initialIdentState) myFromStatement) http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html

6
Haskellの孤立したインスタンス
Haskellアプリケーションを-Wallオプションでコンパイルすると、GHCは孤立したインスタンスについて文句を言います。例: Publisher.hs:45:9: Warning: orphan instance: instance ToSElem Result 型クラスToSElemは私のものではなく、HStringTemplateによって定義されています。 これを修正する方法(インスタンス宣言をResultが宣言されているモジュールに移動する)と、GHCが孤立したインスタンスを回避する理由を理解しましたが、それでも私の方法の方が優れていると思います。コンパイラが不便であるかどうかは気にしません-私よりもむしろ。 ToSElemPublisherモジュールでインスタンスを宣言する理由は、他のモジュールではなく、HStringTemplateに依存するのはPublisherモジュールだからです。私は関心の分離を維持し、すべてのモジュールがHStringTemplateに依存することを避けようとしています。 Haskellの型クラスの利点の1つは、たとえばJavaのインターフェイスと比較した場合、閉じているのではなく開いているため、インスタンスをデータ型と同じ場所で宣言する必要がないことだと思いました。GHCのアドバイスはこれを無視することのようです。 ですから、私が探しているのは、私の考えが健全であり、この警告を無視/抑制することで正当化されるという検証、または私のやり方に反対するより説得力のある議論のいずれかです。
86 haskell  ghc  typeclass 

17
Haskellの後に学ぶべき言語は何ですか?[閉まっている]
現在のところ、この質問は私たちのQ&A形式には適していません。回答は事実、参考資料、または専門知識によって裏付けられることを期待していますが、この質問は、討論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善して再開できると思われる場合は、ヘルプセンターにアクセスしてガイダンスを入手してください。 9年前に閉鎖されました。 ロックされています。この質問はトピックから外れていますが、歴史的に重要であるため、この質問とその回答はロックされています。現在、新しい回答ややり取りは受け付けていません。 私の最初のプログラミング言語として、Haskellを学ぶことにしました。私は分析哲学を専攻しており、Haskellを使用すると、自然言語解析用のトランスデューサー、定理証明者、通訳など、関心のあるプログラムをすばやく正確に作成できました。プログラミングを始めて2か月半しか経っていませんが、Haskellのセマンティクスと構文は、従来の命令型言語よりもはるかに簡単に習得でき、その構成の大部分に(今は)快適に感じることができました。 Haskellでのプログラミングは魔術のようなものですが、プログラミングの知識を広げたいと思います。学ぶために新しいプログラミング言語を選びたいのですが、任意の言語を選んでドロップして繰り返す時間がありません。それで、私が探している言語のタイプについてのいくつかの規定とともに、ここで質問をするつもりでした。主観的なものもあれば、Haskellからの移行を容易にすることを目的としたものもあります。 ストロングタイプシステム。Haskellでのプログラミングの私のお気に入りの部分の1つは、型宣言を書くことです。これは、個々の機能とプログラム全体との関係についての私の考えを構造化するのに役立ちます。また、私のプログラムの正しさについての非公式な推論も容易になります。私は効率ではなく、正確さに関心があります。 反復ではなく再帰に重点を置きます。私はHaskellで反復構造を使用していますが、それらを再帰的に実装しています。ただし、特にコンビネータやマップ、フォールド、バインドなどの高階関数を使用する場合は、複雑な反復手順よりも再帰関数の構造を理解する方がはるかに簡単です。 学ぶことはやりがいがあります。Haskellは働きがいのある言語です。カントを読むのと少し似ています。しかし、数年前のCでの私の経験はそうではありませんでした。私はCを探していません。言語は概念的に興味深いパラダイムを強制する必要がありますが、私の完全に主観的な意見では、Cのようなものはそうではありません。 答えを比較検討する:もちろん、これらは単なるメモです。整形式の回答をいただいた皆様に返信したいと思います。あなたはとても役に立ちました。 1)いくつかの回答は、再帰を強調する強力で静的に型付けされた言語が別の関数型言語を意味することを示しました。私はHaskellと強力に協力し続けたいと思いますが、camccannとlarsmansは、別のそのような言語は「移行を容易にしすぎる」と正しく指摘しました。CamlでHaskellを書くつもりはないので、これらのコメントは非常に役に立ちました!証明アシスタントのうち、CoqとAgdaはどちらも面白そうです。特に、Coqは、建設的論理と形式型理論への確かな紹介を提供します。私は一次述語と様相論理(メンデルソン、エンダートン、ヒンマンの一部)に少し時間を費やしたので、おそらくCoqをとても楽しんでいたでしょう。 2)他の人はLispを強く支持しました(Common Lisp、Scheme、Clojure)。私が集まるところでは、Common LispのとSchemeの両方が(優れた入門資料持つLispのオンと推論スキーマー、SICPを)。SICPの資料により、私はスキームに傾倒します。特に、Scheme through SICPは、さまざまな評価戦略、怠惰の実装、および継続、インタプリタ、記号計算などのトピックに焦点を当てる機会をカバーします。最後に、他の人が指摘しているように、Lispのコード/データの扱いはまったく新しいものになるでしょう。したがって、私はオプション(2)であるLispに大きく傾いています。 3)第三に、プロローグ。Prologには興味深い資料が豊富にあり、そのプライマリドメインはまさに私が興味を持っているものです。それは単純な構文を持ち、読みやすいです。現時点ではこれ以上コメントすることはできませんが、Prologの概要を読み、いくつかの紹介資料をざっと読んだ後、それは(2)にランク付けされます。そして、Prologのバックトラックは常にHaskellにハッキングされているようです! 4)主流の言語の中で、Pythonが最も興味深いように見えます。Tim Yatesは、言語を非常に魅力的に聞こえるようにします。どうやら、Pythonは1年生のCS専攻に教えられることがよくあります。そのため、概念的に豊富であるか、簡単に習得できます。もっと研究しなければならないでしょう。 お勧めありがとうございます!Lisp(Scheme、Clojure)、Prolog、またはCoqやAgdaのような証明アシスタントが推奨される主な言語のようです。

4
Stringを型クラスのインスタンスにできないのはなぜですか?
与えられた: data Foo = FooString String … class Fooable a where --(is this a good way to name this?) toFoo :: a -> Foo のStringインスタンスを作成したいFooable: instance Fooable String where toFoo = FooString 次にGHCは不平を言います: Illegal instance declaration for `Fooable String' (All instance types must be of the form (T t1 ... …

1
このGHCコアの「証拠」を読む方法は?
私は、GHCが自然数の場合、偶数を半分にすることしかできないことをどのように証明するかを理解するために、このHaskellの小さなビットを書きました。 {-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamilies #-} module Nat where data Nat = Z | S Nat data Parity = Even | Odd type family Flip (x :: Parity) :: Parity where Flip Even = Odd Flip Odd = Even data ParNat :: Parity -> * where PZ :: …

3
Haskell:なぜヘルパー関数に「go」という名前を付けるのですか?
goHaskellの資料や情報源を読んでいるとよく見かけますが、それについて本当に快適に感じることはありませんでした-(私の心の中には「goto」という否定的な意味合いがあると思います)。私はLYAHでHaskellのを学び始め、そして私が使用する傾向を拾いのことaccとstepするときは、折り目を書きます。書くための慣習はどこgoから来たのですか? 最も重要なことは、その名前が正確に何goを意味するのでしょうか?

1
型クラスMonadPlus、Alternative、Monoidの違いは?
標準ライブラリHaskellの型クラスMonadPlus、AlternativeおよびMonoidそれぞれが本質的に同じセマンティクスを持つ2つのメソッドを提供します。 空の値:mzero、empty、またはmempty。 オペレータa -> a -> a:一緒に型クラスの値を結合しmplus、<|>またはmappend。 3つすべてが、インスタンスが準拠する必要がある次の法律を指定します。 mempty `mappend` x = x x `mappend` mempty = x したがって、3つの型クラスはすべて同じメソッドを提供しているようです。 (Alternativeも提供someしてmany、彼らのデフォルトの定義は、通常は十分であるので、彼らはこの質問の面であまり重要ではないです。) だから、私の質問は:なぜこれらの3つの非常に類似したクラスがあるのですか?スーパークラスの制約が異なる以外に、それらの間に実際の違いはありますか?

3
ダミーのための再帰スキーム?
たくさんのリンクをたどったり、圏論の教科書を開いたりする必要のない、再帰スキームとコアカーションスキーム(カタモルフィズム、アナモルフィズム、ハイロモルフィズムなど)の非常にシンプルでわかりやすい説明を探しています。私はこれらのスキームの多くを無意識のうちに再発明し、コーディングの過程で頭の中でそれらを「適用」したと確信しています(私たちの多くが持っていると確信しています)が、私は(共)再帰スキームが何であるかわかりません使用と呼ばれます。(OK、私は嘘をついた。私はそれらのいくつかについて読んでいたので、この質問を促した。しかし、今日まで、私には手がかりがなかった。) プログラミングコミュニティ内でのこれらの概念の普及は、たとえばWikipediaだけでなく、他の場所でも見られる傾向のある禁止された説明や例によって妨げられていると思います。 それはおそらく彼らの名前によって妨げられています。いくつかの代替の、数学的な名前(バナナや有刺鉄線についての何か?)があると思いますが、私が使用する再帰スキームのよりかわいい名前が何であるかについてもわかりません。 二分木などの抽象データ型ではなく、単純な現実世界の問題を表すデータ型の例を使用すると役立つと思います。

3
Haskellが(時々)「最高の命令型言語」と呼ばれるのはなぜですか?
(この質問がトピックに含まれていることを願っています-回答を検索しようとしましたが、明確な回答が見つかりませんでした。これがトピックから外れている、またはすでに回答されている場合は、モデレート/削除してください。) Haskellが最高の命令型言語であるという冗談半分のコメントを何度か聞いたり読んだりしたことを覚えています。もちろん、Haskellはその機能的機能で最もよく知られているため、奇妙に聞こえます。 だから私の質問は、Haskellのどのような品質/機能(もしあれば)が、Haskellが最良の命令型言語と見なされることを正当化する理由を与えるのですか?それとも実際にはもっと冗談ですか?

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