Skip to content

Commit

Permalink
Slack log update at Thu Aug 8 09:09:53 2024
Browse files Browse the repository at this point in the history
  • Loading branch information
igrep committed Aug 8, 2024
1 parent ebd2722 commit ee15990
Show file tree
Hide file tree
Showing 6 changed files with 146 additions and 2 deletions.
40 changes: 40 additions & 0 deletions docs/html/CR2TETE5R/25.html
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,46 @@ <h1>haskell-jp / beginners #25</h1>
<div class="description">@igrep<br/>重ねてありがとうございます。<br/>こちらも、調べてみます。</div>
</div>
</div>
<div class="event" id="message-1723043199.659059">
<div class="content">
<div class="summary">
<div class="user">ai-ou</div>
<div class="date"><a class="date" href="#message-1723043199.659059">2024-08-08 00:06:39 +0900</a></div>
</div>
<div class="description">IOモナドの <code>&gt;&gt;=</code> について質問させてください<br/><br/><a href='https://wiki.haskell.org/99_questions/21_to_28'>https://wiki.haskell.org/99_questions/21_to_28</a> の "Problem 23" を参考に<br/>以下のようなコードを作成しました。<br/>("abcdefgh" の中からランダムに 3 文字表示するプログラム)<br/><br/>[コード1]<br/><pre>import System.Random

rnd_select :: [a] -&gt; Int -&gt; IO [a]

rnd_select xs n = do
let l = length xs - 1
ys &lt;- sequence . replicate n $ (randomRIO (0, l) :: IO Int)
return $ map (xs !!) ys</pre><br/>これは想定通り動作しました。<br/><pre>ghci&gt; rnd_select "abcdefgh" 3 &gt;&gt;= putStrLn
efc
it :: ()</pre><br/>この関数を少し変えて、`&gt;&gt;=` を使用するように変更しました。<br/>[コード2]<br/><pre>rnd_select xs n = f &gt;&gt;= return . map (xs !!)
where
l = length xs - 1
f = sequence . replicate n $ (randomRIO (0, l) :: IO Int)</pre><br/>この場合も問題ありません。<br/><br/>さらに、上記の <code>f</code> の部分を (where 句ではなく) 直接書いて以下のように変更しました。<br/>[コード3]<br/><pre>rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)
where
l = length xs - 1</pre><br/>すると、以下のようにエラーとなります。<br/><pre>ghci&gt; :l d
[1 of 2] Compiling Main ( d.hs, interpreted )

d.hs:5:86: error: [GHC-83865]
• Couldn't match type '[Int]' with 'Int'
Expected: Int -&gt; a
Actual: [Int] -&gt; [a]
• In the second argument of '(.)', namely 'map (xs !!)'
In the second argument of '(&gt;&gt;=)', namely 'return . map (xs !!)'
In the second argument of '($)', namely
'(randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)'
|
5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)
| ^^^^^^^^^^^
Failed, no modules loaded.</pre><br/>メッセージから考えて <code>[Int]</code> ではなく <code>Int</code> が要求されているようだったので、以下のように変更したところ<br/>問題なく動作しました。<br/>[コード4]<br/><pre>rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . (xs !!)
where
l = length xs - 1</pre><br/>説明が長くなってしまい恐縮ですが、`[コード3]` と <code>[コード4]</code> のような違いが出る理由が理解できませんでした。</div>
<a class="link-to-replies" href="25/1723043199.659059.html">... Replies ...</a>
</div>
</div>
</div>
<div class="ui pagination menu">
<a href="../../html/CR2TETE5R/24.html" class="item">Previous</a>
Expand Down
78 changes: 78 additions & 0 deletions docs/html/CR2TETE5R/25/1723043199.659059.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>haskell-jp / beginners #25 at 2024-08-08 00:06:39 +0900</title>
<link rel="stylesheet" href="../../../main.css" type="text/css" media="screen">
</head>
<body>
<div class="ui container">
<h1>haskell-jp / beginners #25 at 2024-08-08 00:06:39 +0900</h1>
<div class="ui pagination menu">
<a href="../25.html" class="item">Back to beginners #25</a>
</div>
<div class="ui feed">
<div class="event" id="message-1723043199.659059">
<div class="content">
<div class="summary">
<div class="user">ai-ou</div>
<div class="date"><a class="date" href="#message-1723043199.659059">2024-08-08 00:06:39 +0900</a></div>
</div>
<div class="description">IOモナドの <code>&gt;&gt;=</code> について質問させてください<br/><br/><a href='https://wiki.haskell.org/99_questions/21_to_28'>https://wiki.haskell.org/99_questions/21_to_28</a> の "Problem 23" を参考に<br/>以下のようなコードを作成しました。<br/>("abcdefgh" の中からランダムに 3 文字表示するプログラム)<br/><br/>[コード1]<br/><pre>import System.Random

rnd_select :: [a] -&gt; Int -&gt; IO [a]

rnd_select xs n = do
let l = length xs - 1
ys &lt;- sequence . replicate n $ (randomRIO (0, l) :: IO Int)
return $ map (xs !!) ys</pre><br/>これは想定通り動作しました。<br/><pre>ghci&gt; rnd_select "abcdefgh" 3 &gt;&gt;= putStrLn
efc
it :: ()</pre><br/>この関数を少し変えて、`&gt;&gt;=` を使用するように変更しました。<br/>[コード2]<br/><pre>rnd_select xs n = f &gt;&gt;= return . map (xs !!)
where
l = length xs - 1
f = sequence . replicate n $ (randomRIO (0, l) :: IO Int)</pre><br/>この場合も問題ありません。<br/><br/>さらに、上記の <code>f</code> の部分を (where 句ではなく) 直接書いて以下のように変更しました。<br/>[コード3]<br/><pre>rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)
where
l = length xs - 1</pre><br/>すると、以下のようにエラーとなります。<br/><pre>ghci&gt; :l d
[1 of 2] Compiling Main ( d.hs, interpreted )

d.hs:5:86: error: [GHC-83865]
• Couldn't match type '[Int]' with 'Int'
Expected: Int -&gt; a
Actual: [Int] -&gt; [a]
• In the second argument of '(.)', namely 'map (xs !!)'
In the second argument of '(&gt;&gt;=)', namely 'return . map (xs !!)'
In the second argument of '($)', namely
'(randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)'
|
5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)
| ^^^^^^^^^^^
Failed, no modules loaded.</pre><br/>メッセージから考えて <code>[Int]</code> ではなく <code>Int</code> が要求されているようだったので、以下のように変更したところ<br/>問題なく動作しました。<br/>[コード4]<br/><pre>rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . (xs !!)
where
l = length xs - 1</pre><br/>説明が長くなってしまい恐縮ですが、`[コード3]` と <code>[コード4]</code> のような違いが出る理由が理解できませんでした。</div>
</div>
</div>
<div class="event" id="message-1723075061.495369">
<div class="content">
<div class="summary">
<div class="user">koyama41</div>
<div class="date"><a class="date" href="#message-1723075061.495369">2024-08-08 08:57:41 +0900</a></div>
</div>
<div class="description"><code>sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)</code><br/>は<br/><code>sequence . replicate n $ 残り全部</code> という結合の強さになってしまうので、<br/><code>(randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)</code> という部分だけで考えないといけないことになってしまいます。<br/><code>(sequence . replicate n $ (randomRIO (0, l) :: IO Int)) &gt;&gt;= return . map (xs !!)</code><br/>のように f 相当の部分を明示的にカッコでくくる必要があると思います。<br/>これは <code>&gt;&gt;=</code> の話というよりは、 <code>$</code> が最も弱い結合だということに起因するものですね</div>
</div>
</div>
<div class="event" id="message-1723075519.897439">
<div class="content">
<div class="summary">
<div class="user">ai-ou</div>
<div class="date"><a class="date" href="#message-1723075519.897439">2024-08-08 09:05:19 +0900</a></div>
</div>
<div class="description"><code>$</code> の優先順位の高さの問題だったのですね、理解できました。<br/>今後、似たようなことがあったら <code>()</code> を付けて確認してみます。<br/><br/>長い説明にも関わらず、丁寧な回答をありがとうございました。</div>
</div>
</div>
</div>
<div class="ui pagination menu">
<a href="../25.html" class="item">Back to beginners #25</a>
</div>
</div>
</body>
</html>
2 changes: 1 addition & 1 deletion docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4031,7 +4031,7 @@ <h1>Slack log of haskell-jp</h1>
<div class="content">
<details>
<summary>
<a href="html/CR2TETE5R/25.html">beginners</a> (Last updated at 2024-08-01 10:07:36 +0900)
<a href="html/CR2TETE5R/25.html">beginners</a> (Last updated at 2024-08-08 00:06:39 +0900)
</summary>
<div class="ui items">
<div class="page item">
Expand Down
2 changes: 1 addition & 1 deletion docs/json/.timestamps.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"CR4U9PBLL": "1718427023.145029",
"CAXQ09PN2": "1718427040.110509",
"CD87P78HF": "1708179798.544269",
"CR2TETE5R": "1722474456.706769",
"CR2TETE5R": "1723043199.659059",
"C8R0H137H": "1712650557.679679",
"GDTFWM8KX": "1573264081.002700",
"CL3AXB1AL": "1708179768.126009"
Expand Down
6 changes: 6 additions & 0 deletions docs/json/CR2TETE5R/25.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,5 +172,11 @@
"text": "<@U4LGTMTMK>\n重ねてありがとうございます。\nこちらも、調べてみます。",
"type": "message",
"user": "U04MBBNV5QB"
},
{
"ts": "1723043199.659059",
"text": "IOモナドの `&gt;&gt;=` について質問させてください\n\n<https://wiki.haskell.org/99_questions/21_to_28> の \"Problem 23\" を参考に\n以下のようなコードを作成しました。\n(\"abcdefgh\" の中からランダムに 3 文字表示するプログラム)\n\n[コード1]\n```import System.Random\n\nrnd_select :: [a] -&gt; Int -&gt; IO [a]\n\nrnd_select xs n = do\n let l = length xs - 1\n ys &lt;- sequence . replicate n $ (randomRIO (0, l) :: IO Int)\n return $ map (xs !!) ys```\nこれは想定通り動作しました。\n```ghci&gt; rnd_select \"abcdefgh\" 3 &gt;&gt;= putStrLn\nefc\nit :: ()```\nこの関数を少し変えて、`&gt;&gt;=` を使用するように変更しました。\n[コード2]\n```rnd_select xs n = f &gt;&gt;= return . map (xs !!)\n where\n l = length xs - 1\n f = sequence . replicate n $ (randomRIO (0, l) :: IO Int)```\nこの場合も問題ありません。\n\nさらに、上記の `f` の部分を (where 句ではなく) 直接書いて以下のように変更しました。\n[コード3]\n```rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)\n where\n l = length xs - 1```\nすると、以下のようにエラーとなります。\n```ghci&gt; :l d\n[1 of 2] Compiling Main ( d.hs, interpreted )\n\nd.hs:5:86: error: [GHC-83865]\n • Couldn't match type '[Int]' with 'Int'\n Expected: Int -&gt; a\n Actual: [Int] -&gt; [a]\n • In the second argument of '(.)', namely 'map (xs !!)'\n In the second argument of '(&gt;&gt;=)', namely 'return . map (xs !!)'\n In the second argument of '($)', namely\n '(randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)'\n |\n5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)\n | ^^^^^^^^^^^\nFailed, no modules loaded.```\nメッセージから考えて `[Int]` ではなく `Int` が要求されているようだったので、以下のように変更したところ\n問題なく動作しました。\n[コード4]\n```rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . (xs !!)\n where\n l = length xs - 1```\n説明が長くなってしまい恐縮ですが、`[コード3]` と `[コード4]` のような違いが出る理由が理解できませんでした。",
"type": "message",
"user": "U04MBBNV5QB"
}
]
20 changes: 20 additions & 0 deletions docs/json/CR2TETE5R/25/1723043199.659059.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"ts": "1723043199.659059",
"text": "IOモナドの `&gt;&gt;=` について質問させてください\n\n<https://wiki.haskell.org/99_questions/21_to_28> の \"Problem 23\" を参考に\n以下のようなコードを作成しました。\n(\"abcdefgh\" の中からランダムに 3 文字表示するプログラム)\n\n[コード1]\n```import System.Random\n\nrnd_select :: [a] -&gt; Int -&gt; IO [a]\n\nrnd_select xs n = do\n let l = length xs - 1\n ys &lt;- sequence . replicate n $ (randomRIO (0, l) :: IO Int)\n return $ map (xs !!) ys```\nこれは想定通り動作しました。\n```ghci&gt; rnd_select \"abcdefgh\" 3 &gt;&gt;= putStrLn\nefc\nit :: ()```\nこの関数を少し変えて、`&gt;&gt;=` を使用するように変更しました。\n[コード2]\n```rnd_select xs n = f &gt;&gt;= return . map (xs !!)\n where\n l = length xs - 1\n f = sequence . replicate n $ (randomRIO (0, l) :: IO Int)```\nこの場合も問題ありません。\n\nさらに、上記の `f` の部分を (where 句ではなく) 直接書いて以下のように変更しました。\n[コード3]\n```rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)\n where\n l = length xs - 1```\nすると、以下のようにエラーとなります。\n```ghci&gt; :l d\n[1 of 2] Compiling Main ( d.hs, interpreted )\n\nd.hs:5:86: error: [GHC-83865]\n • Couldn't match type '[Int]' with 'Int'\n Expected: Int -&gt; a\n Actual: [Int] -&gt; [a]\n • In the second argument of '(.)', namely 'map (xs !!)'\n In the second argument of '(&gt;&gt;=)', namely 'return . map (xs !!)'\n In the second argument of '($)', namely\n '(randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)'\n |\n5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)\n | ^^^^^^^^^^^\nFailed, no modules loaded.```\nメッセージから考えて `[Int]` ではなく `Int` が要求されているようだったので、以下のように変更したところ\n問題なく動作しました。\n[コード4]\n```rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . (xs !!)\n where\n l = length xs - 1```\n説明が長くなってしまい恐縮ですが、`[コード3]` と `[コード4]` のような違いが出る理由が理解できませんでした。",
"type": "message",
"user": "U04MBBNV5QB"
},
{
"ts": "1723075061.495369",
"text": "`sequence . replicate n $ (randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)`\n\n`sequence . replicate n $ 残り全部` という結合の強さになってしまうので、\n`(randomRIO (0, l) :: IO Int) &gt;&gt;= return . map (xs !!)` という部分だけで考えないといけないことになってしまいます。\n`(sequence . replicate n $ (randomRIO (0, l) :: IO Int)) &gt;&gt;= return . map (xs !!)`\nのように f 相当の部分を明示的にカッコでくくる必要があると思います。\nこれは `&gt;&gt;=` の話というよりは、 `$` が最も弱い結合だということに起因するものですね",
"type": "message",
"user": "UF8SE896V"
},
{
"ts": "1723075519.897439",
"text": "`$` の優先順位の高さの問題だったのですね、理解できました。\n今後、似たようなことがあったら `()` を付けて確認してみます。\n\n長い説明にも関わらず、丁寧な回答をありがとうございました。",
"type": "message",
"user": "U04MBBNV5QB"
}
]

0 comments on commit ee15990

Please sign in to comment.