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

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


1
この手動で定義されたHasFieldインスタンスで「制約トリック」が機能しないのはなぜですか?
lens(GHC.Records)を使用するこの(確かに奇妙な)コードがあります: {-# LANGUAGE DataKinds, PolyKinds, FlexibleInstances, UndecidableInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Main where import Control.Lens import GHC.Records data Glass r = Glass -- just a dumb proxy class Glassy r where the :: Glass r instance …

1
Haskellでの暗黙の静的型キャスト(強制)
問題 Haskellの次の設計問題を考えてみましょう。変数や一般式(多変量多項式)などを表現したい、シンプルでシンボリックなEDSLがありますx^2 * y + 2*z + 1。また、私は、表現上の特定のシンボリック方程式を表現言いたいx^2 + 1 = 1だけでなく、定義のように、x := 2*y - 2。 目標は次のとおりです。 変数と一般式には別のタイプを使用します。特定の関数は、複雑な式ではなく変数に適用される場合があります。たとえば、定義演算子:=はタイプである可能性があり (:=) :: Variable -> Expression -> Definition、左側のパラメーターとして複雑な式を渡すことはできません(明示的なキャストを行わずに、右側のパラメーターとして変数を渡すことができるはずです)。 。 式をのインスタンスにNumすることで、整数リテラルを式に昇格させ、補助ラッパー演算子を導入しなくても、加算や乗算などの一般的な代数演算に便利な表記法を使用できます。 言い換えると、変数を式に暗黙的かつ静的に型キャスト(強制)したいのです。そのため、Haskellには暗黙の型キャストがないことを知っています。それにもかかわらず、特定のオブジェクト指向プログラミングの概念(この場合は単純な継承)は、言語拡張の有無にかかわらず、Haskellの型システムで表現できます。軽量の構文を維持しながら、上記の両方の点をどのように満たすことができますか?可能ですか? 討論 ここでの主な問題はNumの型制限であることは明らかです。 (+) :: Num a => a -> a -> a 原則として、変数と式の両方に単一の(一般化された)代数データ型を書き込むことが可能です。次に、:=左側の式が区別され、変数コンストラクターのみが受け入れられ、それ以外の場合はランタイムエラーが発生するように記述できます。ただし、これはクリーンで静的な(つまりコンパイル時の)ソリューションではありません... 例 理想的には、次のような軽量の構文を実現したいと思います computation = do x <- variable t …

3
すべての固定サイズのコンテナーは強力なモノイドのファンクターですか、その逆ですか?
Applicative型クラスは、型指定された機能のカテゴリにデカルトmonoidal構造を保持ずさんmonoidalファンクタを表します。 言い換えると(,)、モノイド構造を形成する正準同型が見られる場合: -- Implementations left to the motivated reader assoc_fwd :: ((a, b), c) -> (a, (b, c)) assoc_bwd :: (a, (b, c)) -> ((a, b), c) lunit_fwd :: ((), a) -> a lunit_bwd :: a -> ((), a) runit_fwd :: (a, ()) -> a runit_bwd :: a -> (a, …

1
Haskellでの並列「any」または「all」
私が何度も遭遇したパターンは、値のリストをテストすることで、値のリストをチェックし、要素の一部またはすべてが渡されたかどうかを確認する必要があるパターンです。典型的な解決策は、単に便利なビルトインを使用することであるallとany。 問題は、これらが連続して評価されることです。多くの場合、いずれかのスレッドがの「False」または「True」を見つけると、プロセスの完了と並行して評価する方がはるかに速くなります。プロセス間通信が必要であり、これを実装するのに十分なControl.Concurrentのどこにもまだ理解していないため、Control.Parallelを使用して短絡動作を実装できないと確信しています。allany これは数学ではかなり一般的なパターンです(例:Miller-Rabin Primality)ので、誰かがおそらくすでにこの問題の解決策を考えているように思いますが、明らかな理由により、「並列または/および/すべて/リスト上のすべて」をグーグル検索しますhaskell」は、関連する結果を返しません。

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、つまり_に削減する必要があるため、混乱しています。何が欠けていますか? ありがとう

1
mono-traversableの「concatMap」はどのようにして一般的な議論を「引き出す」ことができますか?
私はHaskellを学んでいて、理解しにくいこの動作に出くわしたときに、Yesodのために単純なDBシードプログラムを実行していました。 testFn :: Int -> Bool -> [Int] testFn a b = if b then replicate 10 a else [] Yesod GHCIセッション: $ :t concatMap testFn [3] concatMap testFn [3] :: Bool -> [Int] $ (concatMap testFn [1,2,3]) True [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3] どういうわけか、各マッピングからその2番目の「ブール値」を単一のカレー引数に「引き出す」ことができました。 標準ベースのプレリュードGHCIセッションでは、この式のコンパイルも拒否されます。 $ :t concatMap testFn [3] error: • Couldn't …

5
自分で繰り返さずにこのアルゴリズムを遅延させるにはどうすればよいですか?
(この質問に対する私の答えに触発されました。) 次のコードを検討してください(指定された入力以下の最大の要素を見つけることが想定されています)。 data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord) closestLess :: Integer -> TreeMap v -> Maybe (Integer, v) closestLess i = precise Nothing where precise :: Maybe (Integer, v) -> TreeMap v -> Maybe (Integer, v) precise closestSoFar …

2
ハスケルの入れ子になった州
やや異なる種類の状態を持つ状態マシンのファミリーを定義しようとしています。特に、より「複雑な」状態機械には、より単純な状態機械の状態を組み合わせることによって形成される状態があります。 (これは、オブジェクトがオブジェクトでもあるいくつかの属性を持つオブジェクト指向の設定に似ています。) これが私が達成したいことの簡単な例です。 data InnerState = MkInnerState { _innerVal :: Int } data OuterState = MkOuterState { _outerTrigger :: Bool, _inner :: InnerState } innerStateFoo :: Monad m => StateT InnerState m Int innerStateFoo = do i <- _innerVal <$> get put $ MkInnerState (i + 1) return i outerStateFoo …

2
合計型-Haskellで `show(Int | Double)`が `(show Int)|と異なる理由 (ダブルを表示) `
なぜこれらは同等ではないのですか? show $ if someCondition then someInt else some double そして if someCondition then show someInt else show someDouble if ... else最初の例の部分を単独で式に分離した場合Int | Double、TypeScriptで簡単に実行できるようなTypeのような匿名合計型でその型を表すことができないことを理解しています(TypeScriptについて言及しているため、 langaugeは頻繁に使用し、Sum型をサポートしているため、Eitherデータを使用する必要があるため、それに基づいてを呼び出しますshow。 ここで示した例はささいなことですが、私にとっては、someCondition「何かを表示し、何かが依存する」と考える方が理にかなっています。コードの重複が少ない場合(ここでは、ショーが2回繰り返されますが、長い関数のアプリケーションでif ... elseある可能性があり、2つ以上の分岐を検討する必要がある場合もあります) 私の考えでは、合計型(ここではInt | Double)を構成する各型がshow関数のパラメーターとして使用できるかどうかをコンパイラーがチェックし、型が正しいかどうかを判断するのは簡単です。さらに良いのは、show関数がstringパラメーターのタイプに関係なく常に返されるため、コンパイラーがすべての可能な「ブランチ」(したがってすべての可能なタイプ)を運ぶ必要がないことです。 そのような機能が存在しないのは選択によるものですか?それとも、実装するのは難しいと思いますか?

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

1
スケールの不変性を制御するには?
いくつかの図を一種のテーブルにまとめようとしています。これは「インデックスプリント」と呼ばれていると思います。写真を撮る人は、一度に多くの写真を確認する必要があるときにそうします。とにかく、これはコードです: main :: IO () main = mainWith @(Diagram B) $ (tile . fmap renderOne) examples renderOne :: AnyGraph -> Diagram B renderOne (AnyGraph gr) = ... tile :: [Diagram B] -> Diagram B tile xs = let columns = (ceiling . sqrt . fromIntegral . length) xs in (vcat …

3
このようなfoldlMの定義を書き留めるには、どのような知識やトレーニングが必要ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 7か月前に閉鎖。 最近、私は実際のケース生産システムの一部でHaskellを使用しようとしています。Haskell型システムは本当に私に大きな助けを提供してくれます。たとえば、あるタイプの関数が必要だと気付いたとき f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b そこのような機能は、実際にあるfoldM、foldlMとfoldrM。 ただし、本当にショックを受けたのは、次のようなこれらの関数の定義です。 foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b foldlM f …


1
Mにモナド的に自然な非同一モナドモーフィズムM〜> Mはありますか?
型シグネチャによる自然変換はa -> a恒等関数でなければならないことが知られています。これは米田補題に続くが、直接導出することもできる。この質問は同じ性質を求めますが、自然な変換ではなくモナド射を求めます。 モナドM ~> N間のモナド射を考えます。(これらはM a -> N a、両側でモナド演算を保持する自然な変換です。これらの変換は、モナドのカテゴリーの射です。)e :: (Monad m) => m a -> m aすべてのモナドで同じように機能するモナド射が存在するかどうかを確認できますm。言い換えると、モナドモーフィズムeは、モナドタイプパラメータでモナド的に自然でなければなりませんm。 モナド自然法則によれば、任意の2つのモナドMとNの間のモナドモーフィズムf:M a-> N aについてはf . e = e . f、適切な型パラメーターが必要 です。 問題は、そのようなeものは恒等関数でなければならないことを証明できるか、またはe次のように定義された非恒等モナド射の反例があるかどうかです。 e :: (Monad m) => m a -> m a e ma = ... そのような定義に失敗した試みの1つeは次のとおりです。 e ma = do …

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