関数型プログラミング言語Haskell Part34 (694レス)
上下前次1-新
209: 2023/02/17(金)00:17 ID:x2uQcODA(1) AAS
 ChatGPTにいろんなサンプル書かせて勉強させてもらってるわ 
210: 2023/02/18(土)07:53 ID:pwjCq/Fb(1) AAS
 >>208ですがスレチですかね 
 Linux板のタイル型WMスレに移動させていただきます (全く動いてないスレなのでダメ元ですが……) 
211(1): 2023/02/23(木)22:53 ID:3VcdShfb(1) AAS
 すみません 
 凄いHを楽しく学ぶ本を復習していて 
 疑問に思って試してみたのですが 
  
 具体的な型が決まらない値(単独変数で)は 
 下記の(Maybeや配列)の他にどんなのがありますでしょうか。 
  
 v1 :: Maybe a 
 v1 = Nothing 
  
 v2 :: [a] 
 v2 = [] 
  
 型拘束を使わない型変数を使って 
 ある単独変数の型を定義できない物かと思いました。 
  
 また関数でも具体的な型が決まらない値を返す 
 関数はありますでしょうか。 
 (Nothingや空リスト以外で) 
212(1): 2023/02/24(金)02:14 ID:PIH/rCf2(1) AAS
 >>211 
 Bing チャットに聞いたらこんなのが返ってきた。参考になるかな。 
  
 型変数を含むデータ型の例としては、関数型、代数的データ型、型クラスなどがあります。 
 例: data Tree a = Leaf a | Node (Tree a) (Tree a) 
 この代数的データ型Treeは任意の型aを要素とする二分木を表します。 
 例: class Eq a where 
 (==) :: a -> a -> Bool 
 (/=) :: a -> a -> Bool 
 この型クラスEqは任意の型aに対して等値性を定義するための仕組みです。 
213: 2023/02/25(土)11:21 ID:h/PI1ikt(1) AAS
 >>212 
 ありがとうございます。 
  
 凄いHを楽しく学ぶ本にも 
 Tree型があったので試してみました。 
  
 具体的な中身が「無い」事を現す値の場合 
 型引数で定義できるみたいです。 
  
 data Tree a = EmptyTree | Node a (Tree a) (Tree a) 
     deriving (Show) 
  
 v3 :: Tree a 
 v3 = EmptyTree 
214(2): 2023/04/29(土)14:07 ID:AoTbqg9O(1) AAS
 マルチポストだが教えてくれ 
 【追記あり】ChatGPTじゃなくて人力でモナドが発明された経緯を適当に調べた(ソース付き)。 
 外部リンク:qiita.com 
 この記事正しいの?こんな話聞いたこともないし。圏論でモジュール性なんて扱えるの? 
215: 2023/05/01(月)00:30 ID:PDTetkfq(1) AAS
 >>214 
 よく分からんけど「モナドが発明された経緯」ではないな 
 1971年の本ですでにモナドについて書かれてるようだし 
 en.wikipedia.org/wiki/Categories_for_the_Working_Mathematician 
216: 2023/05/03(水)20:58 ID:ioA1phJ7(1/2) AAS
 >>214 
 英語で調べてもそんな話出てきたことはないな。 
217: 2023/05/03(水)21:14 ID:ioA1phJ7(2/2) AAS
 これにもそんなストーリー書いてない 
 外部リンク[pdf]:pdfs.semanticscholar.org 
218: 2023/06/09(金)14:58 ID:GYy2ex4t(1) AAS
 lispやらカリー=ハワード同型やらの関連性は 
 数学的な意味では遥か前だし実装上の話かな 
 外部リンク:en.m.wikipedia.org 
219: 2023/06/20(火)00:30 ID:qm9+2t5E(1) AAS
 do 記法でのメモ化について質問です 
 例えば 
  
 do 
     let x <- someComplexExpression 
     print $ f x 
     print $ g x 
  
 のようなコードがあったとしてxの値はf xの評価の時点とg xの評価の時点で2回別々にされますか? 
 少なくともHaskell2010 Lang. Rep. (以下HLR2010)ではこのような場合メモ化されて2回展開されることはないという記述を見つけることはできませんでした 
 なので公式にはこのような記述だと2回展開されると思わなければいけないのだと思います 
 ではsomeComplexExpressionを先に展開してから、展開したものをxにbindするにはどうすれば良いのでしょうか? 
 HLR2010ではswqを使えば良いとあるのですがこの場合 
 x <- seq someComplexExpression someComplexExpression 
 とかでうまく行くんでしょうか? 
 またそれでうまくいってるのかどうか確かめる方法はありますか? 
 つまり実際何回 someComplexExpressionが展開されてる回数を確かめる方法はありますか? 
 よろしくお願い致します 
220: 2023/06/25(日)14:24 ID:H+Ij4nqZ(1/3) AAS
 質問にさせていただきます 
 違う標数での有限体での計算を必要とするコードを考えてます 
  
 ある変数に𝔽₃や𝔽₅の値を混在して代入することはないので𝔽₃の元を生成するconstructor F3や𝔽₅の元を生成すconstructor F5を定義して 
  
 x = F3 $ 1+2 
 y = F5 $ 2-5 
  
 のような記述ができればいいなと思ってます 
 そのためには 
  
 data FiniteFieldCh3 = F3 Int 
 instance Num F3 where... 
  
 のようにF3,F5両方にNumを定義しないといけません 
 面倒なのでFiniteFieldと言うクラスを作って以下のようにできないかやってみたところ 
  
 class FiniteField t where 
     modulus :: t -> Int 
     toInt :: t -> Int 
     fromInt :: Int -> t 
  
 instance ( FiniteField a  ) => ( Num  a ) where 
     x + y = fromInt  
         $ mod ( toInt x ) + ( toInt y ) ) ( char x ) 
221: 2023/06/25(日)14:24 ID:H+Ij4nqZ(2/3) AAS
 以下のようなerror が出てきます 
  
 prog.hs:22:10: error: 
     • The constraint ‘FiniteField a’ 
         is no smaller than the instance head 
       (Use UndecidableInstances to permit this) 
     • In the instance declaration for ‘(Num a)’ 
    | 
 22 | instance ( FiniteField a  ) => ( Num  a ) where 
    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
  
 コレはなんですか? 
 ちなみにFlexibleInstancesというのが必要かとの事なので冒頭に 
 {-# LANGUAGE FlexibleInstances #-} 
 を入れています 
 コンパイラはghc8.4.4です 
 よろしくお願い致します 
222: 2023/06/25(日)14:43 ID:H+Ij4nqZ(3/3) AAS
 すいません、最後の行間違って修正前のやつコピペしました 
  
 class FiniteField t where 
     modulus :: t -> Int 
     toInt :: t -> Int 
     fromInt :: Int -> t 
  
 instance ( FiniteField a  ) => ( Num  a ) where 
     x + y = fromInt  
         $ mod ( toInt x ) + ( toInt y ) ) ( modulus x ) 
  
 です 
 よろしくお願い致します 
223: 2023/06/25(日)15:08 ID:CDxt6lPg(1/2) AAS
 型クラスの単相性制限とか、関数従属性とか、とか。。。 
 的外れなこと言ってたらごめん。 
224: 2023/06/25(日)15:23 ID:CDxt6lPg(2/2) AAS
 なんか Bard とかにつっこんでも情報得られるかも 
225: 2023/06/25(日)17:33 ID:OvK+yilq(1) AAS
 ありがとうございます 
 現在まだ調べてる最中なんですけど 
  
 外部リンク:stackoverflow.com 
  
 によるとどうもclass制約の解決をloopさせないための制約くさいです 
 つまり「aがclasd Cのときclass Dにも入れる事ができる」、「aがclass Dのときclass Cにも入れる事ができる」の宣言 
  
 class ( C a ) => D a where ... 
  
 class ( D a ) => C a where ... 
  
 のような宣言があるとまずいようです 
 なので=>の左側の型は右側の型より“短い”事が要求されるそうです 
 例えばtoDみたいな型生成子を作っておいて 
  
 class ( C a ) => ( D ( toD a ) ) where ... 
  
 などとしないといけないらしいです 
 でその後newtypeを使うとどうやらこうやら書いてあるんですけどなんのことやら 
226(1): 2023/07/03(月)23:45 ID:QPaqlNti(1) AAS
 値とmoduleどっちも含んだdata作ればいいのでは 
227: 2023/07/04(火)00:24 ID:+0TfLuMN(1) AAS
 >>226 
 こういうやつですね 
  
 data FiniteField = FF { val :: Int, modulus :: Int } deriving ( Show, Eq) 
  
 instance Num FiniteField where 
     x + y = FF ( mod ( ( val x ) + ( val y ) ) ( modulus x ) )( modulus x ) 
     x * y = FF ( mod ( ( val x ) * ( val y ) ) ( modulus x ) )( modulus x ) 
     fromInteger x = FF x 1 
  
 でもコレだと例えば 
  
 x = FF 2 7 
 y = FF 4 7 
 x + y 
  
 のような場合実行時にプログラムは値に格納されてるmodulusを読みに行ってから割り算行うという手間がかかります 
 しかし私のやりたいプログラムではそもそも各変数のmodulusは確定していてそもそも読みに行くのはバカバカしい感じがします 
 実行時にxもyも𝔽₇の元と決まりきっててmod の第二引数はコンパイル時点で7と決まっているのにその7を読みに行く作業が無駄に思えるんです 
 しかもコレは型ではなく値なので型チェックの恩恵も受けることができません 
 プログラム中に出てくるmodilus事に全部F2型、F3型、F5型‥と全部作って全部のNum instance一個ずつ定義してとやればできるんでしょうけど、何が上手い逃げ道はないものかと 
228: 2023/07/04(火)11:11 ID:rN492ZrW(1) AAS
 この記事では剰余環を作っているみたいだけど、参考にならないかな 
  
 外部リンク:qiita.com 
229: 2023/07/06(木)01:04 ID:sds/6LG1(1) AAS
 みなさん情報ありがとうございます 
 色々紹介していただいたソースとか自分で探してみた情報とかでまずは一区切りつける事にしました 
 こんな感じになりました 
 外部リンク:ideone.com 
230: 2023/08/05(土)13:07 ID:1IOAcn45(1) AAS
 hage 
231: 2023/09/04(月)14:41 ID:FcZAE9nJ(1) AAS
 haskellは廃れてきてるな、悲しい 
 スペースリーク対応は難しすぎるしライブラリ類も最新のghcだと使えなかったりしてなんか 
 実用的な言語じゃないなって思う 
 xmonadなんかはほとんどBangPatternだよね 
 そういえば自動でstrictにする拡張が2個ぐらいあったけど追ってないどうなの 
232: 2023/09/16(土)21:21 ID:6682wM15(1/3) AAS
 数学の集合は普通順番を付けて書くと思うのですが(添字でアクセスできたほうが便利) 
 なぜ多くの言語では集合に順番がないのでしょうか? 
233: 2023/09/16(土)21:25 ID:6682wM15(2/3) AAS
 等価判定演算子では順番を問わないが、 
 記法としては順番によるインデックスアクセスもできる、が便利だと思うのですが 
  
 一番基礎的な集合の一つである自然数が順番を重視して扱うように大半の集合は順序を整頓して書かないと実用上不便ではないでしょうか? 
234: 2023/09/16(土)23:06 ID:XG1/1lYn(1) AAS
 順番がないやつと順番があるやつは 
 なぜ対等な関係ではなく前者が一般的で後者が特殊だと言われるのか? 
  
 逆に、複素数はなんで虚部があるやつが一般的で虚部がないやつが特殊なのか? 
235: 2023/09/16(土)23:13 ID:6682wM15(3/3) AAS
 数学的概念として等価だったりどちらが特殊とか言えないのは納得しています 
  
 ただ、集合は順序を維持して記述するようにしたほうが明らかに認知的負荷が少なく、数学的記法でも多くの場合でそうなっていると思うのですが、 
 多くの言語で組み込み型の集合がそうなっていないのはどのような思想によるものでしょうか?という質問です 
236: 2023/09/17(日)02:24 ID:yNwKlKA6(1) AAS
 データ型としての起源としては 
 素集合データ構造から始まっているようなので 
 素である(disjoint)ことがまず要求されて 
 他に集合という名前が使われていないことから 
 素で非順序的なデータ型のことを集合型と呼ぶことになった模様 
237: 2023/09/17(日)02:39 ID:XqeO/FaW(1) AAS
 組み込み型とユーザー定義型の区別をなくす思想はある 
 最も正しいことを実現する思想ではなくミスをした場合の罪が軽くなる 
238: 2023/09/17(日)23:47 ID:70jB6wMR(1) AAS
 初心者は++を使うけどなれたら<>を使ってる人が多い気がする 
 SemiGroupであれさえすれば使える<>を使った方が汎用的にかけるからかな 
上下前次1-新書関写板覧索設栞歴
あと 456 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.016s