ロート製薬会長が「副業を受け入れない会社は発展しない」と断言する理由 0025デフォルトの名無しさん2021/12/28(火) 08:27:45.42ID:FaceSKSVhttps://mobile.twitter.com/matusita2012/status/172883696091791361 https://twitter.com/5chan_nel (5ch newer account) 0026デフォルトの名無しさん2021/12/31(金) 02:20:27.03ID:aP8qPSMg シンプルなワードカウント書いたけど関数合成でワードカウントが組めません " ab ccc dd "を[0,1,1,0,1,1,1,0,1,1,0]みたいなリストに変換して ワードの数は3みたいな 以下普通に書いたワードカウント spwc4 :: [Char] -> Int spwc4 s = wc4 s 0 0 where wc4 :: [Char] -> Int -> Int -> Int wc4 [] l c = (c + (if l == 0 then 0 else 1)) wc4 (x:xs) l c | x == ' ' || x == '\t' || x == '\n' || x == '\r' = if l == 0 then wc4 xs 0 c else wc4 xs 0 (c+1) | otherwise = wc4 xs (l+1) c
文字列を chkspand :: Char -> Int chkspand c = if c == ' ' || c == '\t' || c == '\n' || c == '\r' then 0 else 1 に与えて[0,1,1,0,0,1]みたいなリストに変換 これを関数合成でカウントすると内部状態を保持する必要で困惑中 wordcount . map chkspand $ " asas df df" みたいな書き方がしたい 0027デフォルトの名無しさん2021/12/31(金) 03:53:55.07ID:aP8qPSMg 自己解決したけどデータが多いとスタックが... >countword . countchars . map chkspand $ " 1313 13 111 rfr fdf" >5 0028デフォルトの名無しさん2021/12/31(金) 14:45:34.52ID:KqmzC1Ir リストみたいなただのデータコンストラクタだったら、いくら長くてもスタック関係ないのに リストをfoldrしたような物が出てくるとスタックでみんな躓く 0029デフォルトの名無しさん2021/12/31(金) 14:58:51.96ID:bqUePCKa スクラッチで書くなら(0:)で0を追加して(0:1:_)をカウントしていくんだろうな
chkspand :: Char -> Int chkspand c = if c == ' ' || c == '\t' || c == '\n' || c == '\r' then 0 else 1
main = do print $ map chkspand $ " asas df df" print $ wordcount . map chkspand $ " asas df df" 0030デフォルトの名無しさん2021/12/31(金) 16:30:35.01ID:aP8qPSMg>>29 wc5 = let iterator [] = 0 iterator (0:1:xs) = 1 + (iterator xs) iterator (x:xs) = iterator xs in iterator . ((0::Int) :)
wc5 . map chkspand $ "0 hushjuh hhuj 89 546456" 5
上手く行きました イテレータのパターンマッチ目からウロコ 0031デフォルトの名無しさん2021/12/31(金) 20:42:25.11ID:aP8qPSMg>>30のこれ iterator (0:1:xs) = 1 + (iterator xs) 内部で 1+1+1+1+...が積みあがって最後に計算されるの? 0032デフォルトの名無しさん2021/12/31(金) 20:58:03.01ID:bqUePCKa>>31 それは処理系のimplement依存だから一概には言えないけど多分stack上に(1+)関数が乗っていって最後に確定した0が入ってから計算しそうな気がする 0033デフォルトの名無しさん2021/12/31(金) 21:10:21.51ID:aP8qPSMg>>32 了解しました 0034デフォルトの名無しさん2022/01/02(日) 20:44:02.99ID:OOMiLRw0>>30ちょと改変 wc6 = let iter n [] = z iter n (False:True:xs) = let n' = n + 1 in seq n' $ iter n' xs iter n (x:xs) = iter n xs in (iter 0) . (False :)
Output: Error occurred ERROR line 2 - Type error in explicitly typed binding *** Term : fork *** Type : (a -> b -> c,a -> b -> d) -> a -> b -> (c,d) *** Does not match : (a -> b -> c,a -> b -> d) -> a -> (b -> c,b -> d) 0206デフォルトの名無しさん2023/01/30(月) 02:11:06.80ID:jVdK8GQm>>205 fork (f, g) h = (f h, g h) では? 0207デフォルトの名無しさん2023/01/30(月) 04:31:24.57ID:KsiNNj/4>>206 ありがとうございます。その通りでした。 code: pair :: (a->b, a->c) -> a -> (b, c) pair (f, g) x = (f x, g x) fork :: (a->b, a->c) -> a -> (b, c) fork (f, g) h = pair (f, g) h main :: IO () main = do print $ fork (map fst, map snd) (zip [0 .. 4] "hallo") Output: -- ([0,1,2,3,4],"hallo") これで上手く動いたので報告しておこうと思ったら、同じことを2時間以上も前に... oTL 0208デフォルトの名無しさん2023/02/01(水) 14:35:45.13ID:RAEJFXsc Haskell使い(でLinux使い)の皆さんってxmonad使ってますか? ウィンドウフォーカスを切り替えるときにfloatingウィンドウは無視するようにしたいです。 オリジナルのfocusUp'関数は focusUp' :: Stack a -> a focusUp' (Stack t (l:ls) rs) = Stack l ls (t:rs) focusUp' (Stack t [] rs) = Stack x xs [] where (x :| xs) = NE.reverse (t :| rs) と大変記述量の少ない作りになってるのですが、これに最小の変更を加えて目的を実現するとしたらどうするべきでしょうか? 0209デフォルトの名無しさん2023/02/17(金) 00:17:58.82ID:x2uQcODA ChatGPTにいろんなサンプル書かせて勉強させてもらってるわ 0210デフォルトの名無しさん2023/02/18(土) 07:53:47.68ID:pwjCq/Fb>>208ですがスレチですかね Linux板のタイル型WMスレに移動させていただきます (全く動いてないスレなのでダメ元ですが……) 0211デフォルトの名無しさん2023/02/23(木) 22:53:40.11ID:3VcdShfb すみません 凄いHを楽しく学ぶ本を復習していて 疑問に思って試してみたのですが
型変数を含むデータ型の例としては、関数型、代数的データ型、型クラスなどがあります。 例: data Tree a = Leaf a | Node (Tree a) (Tree a) この代数的データ型Treeは任意の型aを要素とする二分木を表します。 例: class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool この型クラスEqは任意の型aに対して等値性を定義するための仕組みです。 0213デフォルトの名無しさん2023/02/25(土) 11:21:45.77ID:h/PI1ikt>>212 ありがとうございます。
凄いHを楽しく学ぶ本にも Tree型があったので試してみました。
具体的な中身が「無い」事を現す値の場合 型引数で定義できるみたいです。
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
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 ) 0221デフォルトの名無しさん2023/06/25(日) 14:24:14.71ID:H+Ij4nqZ 以下のような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 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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
{-# LANGUAGE OverloadedStrings #-} import System.Posix.Files.ByteString
main = do touchFile "hoge.txt"
touch.hs: hoge.txt: touchFile: does not exist (No such file or directory) というエラーがでます ないのは当たり前でtouchで作ろうとしてるのですがバグがあるのでしょうか? 0241デフォルトの名無しさん2023/09/19(火) 19:54:00.31ID:QCYT99dv unixのtouchを実現したいのですが
{-# LANGUAGE OverloadedStrings #-} import System.Posix.Files.ByteString
main = do touchFile "hoge.txt"
touch.hs: hoge.txt: touchFile: does not exist (No such file or directory) というエラーがでます ないのは当たり前でtouchで作ろうとしてるのですがバグがあるのでしょうか? 0242デフォルトの名無しさん2023/09/19(火) 19:58:16.28ID:QCYT99dv すみません、書き込むボタンの反応がなかったので連投になってしまいました 0243デフォルトの名無しさん2023/09/19(火) 20:14:24.31ID:a563RtWW touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ 0244デフォルトの名無しさん2023/09/19(火) 20:14:45.64ID:a563RtWW touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ 0245デフォルトの名無しさん2023/09/19(火) 20:18:27.88ID:a563RtWW ありゃ俺も連投しちまったすまん なんか5ch重いっぽいね 0246デフォルトの名無しさん2023/09/20(水) 08:38:40.03ID:I55f6i4N for i in * ; do touch anotherdir/$i ; done 0247デフォルトの名無しさん2023/09/20(水) 08:53:25.46ID:I55f6i4N>>246(bash)でお茶を濁した
perlが明日消えてなくなるらしいのでHaskellをPerlの代わりに使おうと思う 正規表現とグロブ、ファイル入出力はできた 他に何かあるかな 0248デフォルトの名無しさん2023/09/22(金) 12:15:07.45ID:NjV4q9P3 数値のリストl=[1,10,3]みたいなのを 1 10 3と出力したい。末尾には空白はあってはならないとする 最初 putStrLn $ intersperse ' ' $ foldl' (\acc x -> acc ++ show x) [] l こんなのを考えたのだが10も1 0と分解されてしまった しかたなく泥臭いこんなコードを書いたのだがもっといい方法はないだろうか mp [] = return () mp [x] = putStrLn $ show x mp (x:xs) = do putStr $ show x ++ " " mp xs 0249デフォルトの名無しさん2023/09/22(金) 13:06:36.18ID:8SLDLfd5https://jutememo.blogspot.com/2008/06/haskell-join-listdata-intersperse.html0250デフォルトの名無しさん2023/09/22(金) 14:01:02.50ID:NjV4q9P3 putStrLn $ intercalate " " $ map show l これでいけました 0251デフォルトの名無しさん2023/09/22(金) 14:01:12.58ID:W8j4O+ex 泥臭いだけで罪があるかのように日常的に刷りこまれてるから 本当の有罪確定したやつは絶対許してもらえないよな そりゃそうだよな 0252デフォルトの名無しさん2023/09/27(水) 15:30:51.70ID:9Ywamwi5 {-# LANGUAGE BinaryLiterals #-} この拡張をいれても let t = read "0x111" :: Int -- 16進数にパースできる 273 let s = read "0b111" :: Int -- 2進数にはパースできない 微妙に不便だ 0253デフォルトの名無しさん2023/09/27(水) 17:59:16.99ID:k7PwLxD8 readが定義されたモジュールは別のLANGUAGEってこと? 0254デフォルトの名無しさん2023/10/11(水) 15:16:15.28ID:1pnnvG+R groupBy (\a b -> snd a == snd b) これを括弧を使わずにかけますか groupBy ((==)<$>snd<*>snd)だと(a,b)->Boolとなって(a,b)->(c,d)->Boolとは型があいませんでした 0255デフォルトの名無しさん2023/10/11(水) 17:39:54.48ID:Fikp0OWy>>254 import Data.Function groupBy ((==) `on` snd)
prop :: Positive Int -> [Int] -> Property prop (Positive n) an = all (>=2) an && length an == n ==> monadicIO $ do a' <- run (solve n an) assert True 0258デフォルトの名無しさん2023/11/16(木) 18:41:54.01ID:wXoixzgD 岡部健、復活したよ!