-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Slack log update at Thu Aug 8 09:09:53 2024
- Loading branch information
Showing
6 changed files
with
146 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>>>=</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] -> Int -> IO [a] | ||
|
||
rnd_select xs n = do | ||
let l = length xs - 1 | ||
ys <- sequence . replicate n $ (randomRIO (0, l) :: IO Int) | ||
return $ map (xs !!) ys</pre><br/>これは想定通り動作しました。<br/><pre>ghci> rnd_select "abcdefgh" 3 >>= putStrLn | ||
efc | ||
it :: ()</pre><br/>この関数を少し変えて、`>>=` を使用するように変更しました。<br/>[コード2]<br/><pre>rnd_select xs n = f >>= 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) >>= return . map (xs !!) | ||
where | ||
l = length xs - 1</pre><br/>すると、以下のようにエラーとなります。<br/><pre>ghci> :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 -> a | ||
Actual: [Int] -> [a] | ||
• In the second argument of '(.)', namely 'map (xs !!)' | ||
In the second argument of '(>>=)', namely 'return . map (xs !!)' | ||
In the second argument of '($)', namely | ||
'(randomRIO (0, l) :: IO Int) >>= return . map (xs !!)' | ||
| | ||
5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) >>= 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) >>= 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) >>= return . map (xs !!)</code><br/>は<br/><code>sequence . replicate n $ 残り全部</code> という結合の強さになってしまうので、<br/><code>(randomRIO (0, l) :: IO Int) >>= return . map (xs !!)</code> という部分だけで考えないといけないことになってしまいます。<br/><code>(sequence . replicate n $ (randomRIO (0, l) :: IO Int)) >>= return . map (xs !!)</code><br/>のように f 相当の部分を明示的にカッコでくくる必要があると思います。<br/>これは <code>>>=</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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
[ | ||
{ | ||
"ts": "1723043199.659059", | ||
"text": "IOモナドの `>>=` について質問させてください\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] -> Int -> IO [a]\n\nrnd_select xs n = do\n let l = length xs - 1\n ys <- sequence . replicate n $ (randomRIO (0, l) :: IO Int)\n return $ map (xs !!) ys```\nこれは想定通り動作しました。\n```ghci> rnd_select \"abcdefgh\" 3 >>= putStrLn\nefc\nit :: ()```\nこの関数を少し変えて、`>>=` を使用するように変更しました。\n[コード2]\n```rnd_select xs n = f >>= 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) >>= return . map (xs !!)\n where\n l = length xs - 1```\nすると、以下のようにエラーとなります。\n```ghci> :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 -> a\n Actual: [Int] -> [a]\n • In the second argument of '(.)', namely 'map (xs !!)'\n In the second argument of '(>>=)', namely 'return . map (xs !!)'\n In the second argument of '($)', namely\n '(randomRIO (0, l) :: IO Int) >>= return . map (xs !!)'\n |\n5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) >>= 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) >>= 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) >>= return . map (xs !!)`\nは\n`sequence . replicate n $ 残り全部` という結合の強さになってしまうので、\n`(randomRIO (0, l) :: IO Int) >>= return . map (xs !!)` という部分だけで考えないといけないことになってしまいます。\n`(sequence . replicate n $ (randomRIO (0, l) :: IO Int)) >>= return . map (xs !!)`\nのように f 相当の部分を明示的にカッコでくくる必要があると思います。\nこれは `>>=` の話というよりは、 `$` が最も弱い結合だということに起因するものですね", | ||
"type": "message", | ||
"user": "UF8SE896V" | ||
}, | ||
{ | ||
"ts": "1723075519.897439", | ||
"text": "`$` の優先順位の高さの問題だったのですね、理解できました。\n今後、似たようなことがあったら `()` を付けて確認してみます。\n\n長い説明にも関わらず、丁寧な回答をありがとうございました。", | ||
"type": "message", | ||
"user": "U04MBBNV5QB" | ||
} | ||
] |