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

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

2
Haskellコードのフラグメントを組み合わせて全体像を把握する
これは私がどこかで見つけたコードですが、これがどのように機能するか知りたいです: findIndices :: (a -> Bool) -> [a] -> [Int] findIndices _ [] = [] findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs)) 出力:findIndices (== 0) [1,2,0,3,0]==[2,4]、ここpredで(==0)&xsは[1,2,0,3,0] 私の理解の一部を紹介します。 (zip [0..] xs) 上記の行が行うことは、リスト内のすべてにインデックスを付けることです。上記の入力の場合、次のようになります[(0,1),(1,2),(2,0),(3,3),(4,0)]。 (pred . snd) これはのようなものであることがわかりましたpred (snd (x))。私の質問は、xリストはzip行から作成されていますか?私はイエスに傾いていますが、私の推測は薄っぺらです。 次は、私の理解であるfstとsnd。そんなこと知ってる fst(1,2) = 1 そして snd(1,2) = …

1
Haskellでの(^)の奇妙な動作
GHCiが以下の不正解を返すのはなぜですか? GHCi λ> ((-20.24373193905347)^12)^2 - ((-20.24373193905347)^24) 4.503599627370496e15 Python3 >>> ((-20.24373193905347)**12)**2 - ((-20.24373193905347)**24) 0.0 更新 Haskellの(^)関数を次のように実装します。 powerXY :: Double -> Int -> Double powerXY x 0 = 1 powerXY x y | y < 0 = powerXY (1/x) (-y) | otherwise = let z = powerXY x (y `div` 2) in …

1
Haskellで評価される関数a->()にはどのような規則がありますか?
タイトルが言うように:評価されるユニットを返すHaskell関数にはどのような保証がありますか?そのような場合、いかなる種類の評価も実行する必要はないと考えられ()ますが、厳密さの明示的な要求が存在しない限り、コンパイラーはそのようなすべての呼び出しを即時値に置き換えることができます。リターン()またはボトム。 私はこれをGHCiで実験しましたが、逆のことが起こっているようです。つまり、そのような関数は評価されているように見えます。非常に原始的な例は f :: a -> () f _ = undefined 評価f 1すると、が存在するためにエラーがスローされるundefinedため、評価が確実に行われます。ただし、評価の深さは明確ではありません。場合によっては、を返す関数へのすべての呼び出しを評価する必要があるほど深くなるように見えることがあり()ます。例: g :: [a] -> () g [] = () g (_:xs) = g xs このコードは、を指定すると無限にループしg (let x = 1:x in x)ます。しかしその後 f :: a -> () f _ = undefined h :: a -> () h _ …

1
継続モナドを左と右の随伴に因数分解する方法は?
状態モナドは積(左-ファンクター)とリーダー(右-表現可能)に因数分解できます。 継続モナドを因数分解する方法はありますか?以下のコードは、チェックを入力しない私の試みです -- To form a -> (a -> k) -> k {-# LANGUAGE MultiParamTypeClasses, TypeOperators, InstanceSigs, TypeSynonymInstances #-} type (<-:) o i = i -> o -- I Dont think we can have Functor & Representable for this type synonym class Isomorphism a b where from :: a -> …

1
rakuのモジュールでPreludeモジュールのようにHaskellを使用する
私はいくつかのパーツを含む描画パッケージを書いており、演算子とデータ型が散在しています。ただし、ユーザーに毎回対応するモジュールを追加してほしくありません。これは非常に煩雑になるためです。たとえばPoint、次のような異なるパスにクラス、Monoidロール、Styleクラスがあるとします。 unit module Package::Data::Monoid; # $?FILE = lib/Package/Data/Monoid.pm6 role Monoid {...} unit module Package::Data::Point; # $?FILE = lib/Package/Data/Point.pm6 class Point {...} unit module Package::Data::Style; # $?FILE = lib/Package/Data/Style.pm6 class Style {...} 私はそのよう なスクリプトを書くことができるという効果でhaskell同様のプレリュードを持ちたいですlib/Package/Prelude.pm6 use Package::Prelude; # I can use Point right away, Style etc... する代わりに use Package::Data::Style; use Package::Data::Point; use …
11 haskell  raku 

1
`coerce`によるタイプロールと紛らわしい動作
タイプがId aあり、誤って強制的に変換しないようにしようとしId DoubleていId Intます。 タイプの役割を正しく理解していれば、以下はコンパイルできません。 {-# LANGUAGE RoleAnnotations #-} import Data.Coerce (coerce) type role Id nominal newtype Id a = Id String badKey :: Id Int badKey = coerce (Id "I point to a Double" :: Id Double) 残念ながら、それはします: Prelude> :load Id.hs [1 of 1] Compiling Main ( Id.hs, interpreted …
11 haskell  roles  coerce 

2
F#での入れ子の任意のレベルのリストの合計
私はint任意の入れ子のsのリストの合計を返すF#関数を作成しようとしています。つまり。a list<int>、a list<list<int>>、aで機能しlist<list<list<list<list<list<int>>>>>>ます。 Haskellでは、次のように記述します。 class HasSum a where getSum :: a -> Integer instance HasSum Integer where getSum = id instance HasSum a => HasSum [a] where getSum = sum . map getSum それは私にできるでしょう: list :: a -> [a] list = replicate 6 nestedList :: [[[[[[[[[[Integer]]]]]]]]]] nestedList = list $ …
10 haskell  f# 

2
Haskellの存在型の明確化
私はHaskellの存在型を理解しようとしていて、PDF http://www.ii.uni.wroc.pl/~dabi/courses/ZPF15/rlasocha/prezentacja.pdfに遭遇しました これまでの理解を訂正してください。 存在する型は、それらに含まれる型には関心がないようですが、パターンマッチングにより、TypeableまたはDataを使用しない限り、型がわからない型が存在すると言われています。 タイプを非表示にする場合(たとえば、異種リストの場合)、またはコンパイル時にタイプがわからない場合は、これらを使用します。 GADTは、暗黙forallの 私の疑問 上記のPDFの20ページでは、関数が特定のバッファーを要求することは不可能であることが以下のコードで言及されています。なぜそうなのですか?関数のドラフトをしているとき、どのデータを使用するのかわからない場合でも、使用するバッファーの種類を正確に把握しています。持つことの何が悪いのか:: Worker MemoryBuffer Int彼らが本当にBufferを抽象化したいのなら、Sum型data Buffer = MemoryBuffer | NetBuffer | RandomBufferを持ち、次のような型を持つことができます:: Worker Buffer Int data Worker x = forall b. Buffer b => Worker {buffer :: b, input :: x} data MemoryBuffer = MemoryBuffer memoryWorker = Worker MemoryBuffer (1 :: Int) memoryWorker :: …

1
数量化された制約を使用してOrdを派生させる(すべてa。Ord a => Ord(fa))
定量化された制約を使用してEq (A f)、うまく導出できますか?ただし、Ord(A f)を導出しようとすると失敗します。制約クラスにスーパークラスがある場合、数量化された制約の使用方法がわかりません。Ord (A f)スーパークラスを持つ他のクラスをどのように派生させるのですか? > newtype A f = A (f Int) > deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f) > deriving instance (forall a. Ord a => Ord (f a)) => Ord (A f) <interactive>:3:1: error: • Could not deduce …

1
Haskellのブラケット関数が実行可能ファイルで機能するのに、テストでクリーンアップできないのはなぜですか?
Haskellのbracket関数が、stack runまたはstack testが使用されているかどうかによって異なる動作をするという非常に奇妙な動作を目にしています。 次のコードを検討してください。ネストされた2つのブラケットがDockerコンテナの作成とクリーンアップに使用されています。 module Main where import Control.Concurrent import Control.Exception import System.Process main :: IO () main = do bracket (callProcess "docker" ["run", "-d", "--name", "container1", "registry:2"]) (\() -> do putStrLn "Outer release" callProcess "docker" ["rm", "-f", "container1"] putStrLn "Done with outer release" ) (\() -> do bracket (callProcess …

1
パターンを述語関数として使用する便利な方法はありますか?
私は最近、述語関数を別の関数に渡す必要がある状況に遭遇しており、私が探しているロジックは、基本的に「この値がこのパターンに一致するか」というものです。 宣言、doブロック、リスト内包表記ではパターンマッチングが推奨されるようですが、述語を使用する関数がいくつかありa -> Bool、パターンを何らかの方法で渡すと非常に便利です。たとえば、takeWhile、until、find、span、など これまでのところ、私は\a -> case a of MyCons _ -> True; otherwise -> False名前付き関数のアラを書いてきましたlet myPred (MyCons _) = True; myPred _ = False inが、どちらもひどく醜く、あまり慣用的ではないようです。「明白な」(そして間違った)方法は、次のようなものです\(MyCons _) -> Trueが、当然、部分的であるためにエラーをスローします。 この種のことを行うためのより簡潔でクリーンな方法はありますか?または私は物事を完全に間違った方法で行っていますか?
10 haskell 

1
完全に依存する連結を作成する
連結に関する素晴らしい真の事実は、方程式の2つの変数がわかっている場合です。 a ++ b = c 次に、3番目を知っています。 このアイデアを自分の連結に取り込んで、機能的な依存関係を使用したいと思います。 {-# Language DataKinds, GADTs, FlexibleContexts, FlexibleInstances, FunctionalDependencies, KindSignatures, PolyKinds, TypeOperators, UndecidableInstances #-} import Data.Kind (Type) class Concatable (m :: k -> Type) (as :: k) (bs :: k) (cs :: k) | as bs -> cs , as cs -> bs , …

4
Haskellの純粋な関数と副作用を理解する-putStrLn
最近、関数型プログラミングに関する知識を広げたかったので、Haskellを学び始めました。これまで、本当にそれを愛していると言わざるを得ません。現在使用しているリソースは、Pluralsightのコース「Haskell Fundamentals Part 1」です。残念ながら、私は次のコードに関する講師の特定の引用を理解するのにいくつかの困難があり、皆さんがトピックにいくつかの光を当てることができることを望んでいました。 付随するコード helloWorld :: IO () helloWorld = putStrLn "Hello World" main :: IO () main = do helloWorld helloWorld helloWorld 見積もり doブロックで同じIOアクションが複数回ある場合、それは複数回実行されます。したがって、このプログラムは文字列「Hello World」を3回出力します。この例は、それputStrLnが副作用のある関数ではないことを示しています。変数putStrLnを定義するために関数を1回呼び出しhelloWorldます。putStrLn文字列を出力する副作用がある場合、文字列は1回だけ出力さhelloWorldれ、メインのdoブロックで繰り返される変数は何の効果もありません。 他のほとんどのプログラミング言語では、putStrLn関数が呼び出されたときに印刷が行われるため、このようなプログラムは「Hello World」を一度だけ印刷します。この微妙な違いは、初心者を誤解させることが多いため、これについて少し考えて、このプログラムが「Hello World」を3回印刷する理由と、putStrLn関数が副作用として印刷を行った場合に1回だけ印刷される理由を理解していることを確認してください。 わからないこと 私にとっては、「Hello World」という文字列が3回表示されるのはほぼ自然なことです。私はhelloWorld変数(または関数?)を、後で呼び出される一種のコールバックとして認識します。私が理解していないのは、putStrLn副作用があった場合に文字列が1回だけ出力されるということです。または、なぜ他のプログラミング言語で一度だけ印刷されるのか。 C#コードで、次のようになっているとしましょう。 C# (フィドル) using System; public class Program { public static void HelloWorld() { Console.WriteLine("Hello World"); } …
10 haskell 

1
リストの最後から2番目の要素を見つけるとき、なぜこれらの中で「最後」を使用するのが最も速いのですか?
以下の3つの関数は、リストの最後から2番目の要素を検索します。使用してlast . initいるものは他のものよりもはるかに速いようです。理由がわからないようです。 テストでは、[1..100000000](1億)の入力リストを使用しました。最後のものはほとんど瞬時に実行されますが、他のものは数秒かかります。 -- slow myButLast :: [a] -> a myButLast [x, y] = x myButLast (x : xs) = myButLast xs myButLast _ = error "List too short" -- decent myButLast' :: [a] -> a myButLast' = (!! 1) . reverse -- fast myButLast'' :: [a] -> a …
10 haskell 

3
固定最小長リストを完全かつエレガントな方法で使用するにはどうすればよいですか?
私は現在、次のような関数を扱っています。 foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def) つまり、リストが与えられた場合、最初の6つの要素を何かに使用し、リストが6要素未満の場合defは、欠落している要素の代わりとして使用します。これは合計ですが、その一部は(のようにmap fromJust . filter isJust)異なるため、私は好きではありません。私はこれを書き直して、偏りを使用する必要がないようにして、これを得ました: foo [] = foobar def def def def def def foo [a] = foobar a def def def def def foo [a,b] = foobar a b def def def …

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