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

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

3
Haskellでのリストの三角形化
triangularize :: [a] -> [[a]](おそらく無限の)リストを取り、それをリストのリストに「三角形化」する効率的なHaskell関数を書くことに興味があります。たとえば、triangularize [1..19]返す必要があります [[1, 3, 6, 10, 15] ,[2, 5, 9, 14] ,[4, 8, 13, 19] ,[7, 12, 18] ,[11, 17] ,[16]] 効率的には、リストの長さがO(n)どこにあるのかを実行することを意味しnます。 リスト(配列)の末尾への追加は一定時間の操作であるため、これはPythonなどの言語で非常に簡単に実行できることに注意してください。これを実現する非常に命令的なPython関数は次のとおりです。 def triangularize(elements): row_index = 0 column_index = 0 diagonal_array = [] for a in elements: if row_index == len(diagonal_array): diagonal_array.append([a]) else: diagonal_array[row_index].append(a) if …

1
クラスなしで帰納的に型の等価性を証明する方法は?
型レベルリストの結合性を証明するために、制約を実行せずに同等の型間で変換できるようにしています。 連結の標準的な定義を仮定すると、 type family (++) (xs :: [k]) (ys :: [k]) :: [k] where '[] ++ ys = ys (x ': xs) ++ ys = x ': (xs ++ ys) 機能が与えられたとしましょう: given :: forall k (a :: [k]) (b :: [k]) (c :: [k]). Proxy ((a ++ b) ++ c) …
8 haskell  types 

1
修正とMu同型
でrecursion-schemes、パッケージは、次の種類が定義されています。 newtype Fix f = Fix (f (Fix f)) newtype Mu f = Mu (forall a. (f a -> a) -> a) それらは同型ですか?もしそうなら、どうやってそれを証明しますか?


1
関数の型ではなく引数の型に制約を置くとどうなりますか?
関数の型ではなく、関数の引数の型に制約を設定します。 これは構文エラーになるか、関数のタイプに情報が追加されると思いました。 しかし、制約は完全に無視されているようです。 {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RankNTypes #-} test :: a -> String test (n :: (Num a, Ord a) => a) = if n > 10 then "Hello" else "World" main = print "Hello World" これにより、次のタイプのエラーが発生します。 Test3.hs:6:8: error: • No instance for (Num a) arising from …
8 haskell 

1
Haskell-自動モナドインスタンス
Monadクラスの一部になる独自のデータ型を作成しようとしていますが、 newtype Container a = Container a deriving Monad 私にこのエラーを与えます: * Can't make a derived instance of `Monad Container' (even with cunning GeneralizedNewtypeDeriving): cannot eta-reduce the representation type enough * In the newtype declaration for `Container' | 30 | newtype Container a = Container a deriving Monad 他のクラス(たとえば、表示)では正常に機能しますが、モナドでは機能しません。コンテナをモナドクラスにインスタンス化するようにghciを説得するにはどうすればよいですか? ありがとう

2
Haskell-numpyの変形を再現
Haskellに入って、リストでnumpyの再形成のようなものを再現しようとしています。具体的には、フラットリストを指定して、n次元リストに再形成します。 import numpy as np a = np.arange(1, 18) b = a.reshape([-1, 2, 3]) # b = # # array([[[ 1, 2, 3], # [ 4, 5, 6]], # # [[ 7, 8, 9], # [10, 11, 12]], # # [[13, 14, 15], # [16, 17, 18]]]) 固定インデックスで動作を再現することができました。例: *Main> reshape23 …
8 arrays  numpy  haskell 

1
Haskellの計算負荷の高いスレッドが他のすべてのスレッドをブロックする
メインスレッドが計算のために新しいスレッドをフォークし、一定の期間終了するのを待つプログラムを作成したいと思います。子スレッドが所定の時間内に完了しない場合、タイムアウトして強制終了されます。これには次のコードがあります。 import Control.Concurrent fibs :: Int -> Int fibs 0 = 0 fibs 1 = 1 fibs n = fibs (n-1) + fibs (n-2) main = do mvar <- newEmptyMVar tid <- forkIO $ do threadDelay (1 * 1000 * 1000) putMVar mvar Nothing tid' <- forkIO $ do if …

1
Haskell関数 `seq`はどこから名前を取得しますか?
私はそれが得るseq不要な怠惰を避けることによって、パフォーマンスを向上させるために使用されます。名前の由来を知りたいだけですか?それは「シーケンス」または「シーケンシャル」からですか?そして、その名前はどのように厳格な評価と関係していますか?
8 haskell 

1
ArrowとApplicativeとは異なり、相互イールドによってArrowApplyとMonadsが同等になるのはなぜですか?
これが私が参照するSOの投稿です。また、資料を分離しないために、その質問ではOPと同じスニペットを使用します。 インスタンスがモナドを生成すること、およびその逆が広く知られていArrowApplyます。 newtype ArrowMonad a b = ArrowMonad (a () b) instance Arrow a => Functor (ArrowMonad a) where fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f instance Arrow a => Applicative (ArrowMonad a) where pure x = ArrowMonad (arr (const x)) ArrowMonad f <*> ArrowMonad x …

2
newtypeのMArrayインスタンスの再利用
私はこのようなダースをたくさん持っています: newtype MyBool = MyBool Bool newtype MyInt = MyInt Int 既存のインスタンスを再利用したい: instance MArray IOUArray Int IO where ... instance MArray (STUArray s) Int (ST s) where ... これらのインスタンスを実装し、すべての定型コードを取得することは、私が最後に望んでいることです。 私が達成しようとしていることに非常に近いものを見つけました: {-# LANGUAGE GeneralizedNewtypeDeriving, StandaloneDeriving #-} deriving instance MArray IOUArray MyInt IO deriving instance MArray (STUArray s) MyInt (ST s) しかし、それは失敗します: …

3
ブラケットはスレッド内でリソースを解放しません
Haskellで問題が発生しbracketています。フォークされたスレッド内で(forkFinally)bracketの2番目の引数を使用して実行すると、プログラムの終了時にリソースを解放する計算が実行されません。 問題を示すコードは次のとおりです(この特定のケースでは、バッファリングを無効にしてファイルにすぐに書き込むことができることを知っています)。 import System.IO import Control.Exception ( bracket , throwTo ) import Control.Concurrent ( forkFinally , threadDelay ) main = do threadId <- forkFinally (writeToFile "first_file") (\ex -> putStrLn $ "Exception occurred: " ++ show ex) putStrLn "Press enter to exit" _ <- getLine putStrLn "Bye!" writeToFile :: FilePath -> …

2
タイプ[[a]]の法則->([a]、[a])
私は宿題からこの質問をしようとしています: 任意の場合、リストとペアを含めfoo :: [[a]] -> ([a], [a])、関数がfoo満たす1つの法則を書き留めmapます。 いくつかのコンテキスト:私は関数型プログラミングのコースを受講する1年生です。コースはかなり入門的なものですが、講師はシラバスから多くのことを述べてきましたが、その中には自由定理があります。だから、Wadlerの論文を読むことを試みた後、私はそれを起算concat :: [[a]] -> [a]法律をmap f . concat = concat . map (map f)我々は持っている必要がありますから、私の問題に関連して見えるfoo xss = (concat xss, concat' xss)場所concatとconcat'種類のいずれかの機能です[[a]] -> [a]。次にをfoo満たしbimap (map f, map g) . foo = \xss -> ((fst . foo . map (map f)) xss, (snd . foo . …


1
Traversablesの自然法はどういう意味ですか?
自然法は次のように述べています: t . traverse f == traverse (t . f) -- for every applicative transformer t 法則のRHSの場合、fの型がの場合、関数構成のためApplicative a => x -> a y、tはの型でなければなりません(Applicative a, Applicative b) => a y -> b y。 LHSの場合、トラバースfのタイプは(Applicative a, Traversable c) => c x -> a (c y)です。しかし、トラバースfはtで構成されているためです。トラバースf、tのタイプは(cx-> a(cy))-> b yでなければなりません。 LHSの場合、tの型はa(cy)-> byですが、RHSの型はay-> b yです。タイプの観点から法律はどのように聞こえますか? …

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