Haskellの特徴として pure ということが挙げられる。 pure というのは副作用がないってこと。 画面に何か出力したり、ファイルから読み込んだり、ネットワーク通信したり、というのは副作用に分類される。 しかし実際のところは Haskell で書いたプログラムでファイルを読み込んだりできる。 pure なのに。どういうこと?
みんなだいすき JavaScript を例にして簡単に説明してみる。
対象コードはコレ。
scala.Predef.getClass.getMethods.map(_.getName).distinct.sorted.map(n => s"`$n` => _").mkString("import Predef.{", ",", ", _}") | |
// import Predef.{`$conforms` => _,`$qmark$qmark$qmark` => _,`ArrayCharSequence` => _,`ArrowAssoc` => _,`Boolean2boolean` => _,`Byte2byte` => _,`Character2char` => _,`ClassManifest` => _,`Double2double` => _,`Ensuring` => _,`Float2float` => _,`Integer2int` => _,`Long2long` => _,`Manifest` => _,`Map` => _,`NoManifest` => _,`RichException` => _,`SeqCharSequence` => _,`Set` => _,`Short2short` => _,`StringAdd` => _,`StringCanBuildFrom` => _,`StringFormat` => _,`any2ArrowAssoc` => _,`any2Ensuring` => _,`any2stringadd` => _,`any2stringfmt` => _,`arrayToCharSequence` => _,`assert` => _,`assume` => _,`augmentString` => _,`boolean2Boolean` => _,`booleanArrayOps` => _,`booleanWrapper` => _,`byte2Byte` => _,`byteArrayOps` => _,`byteWrapper` => _,`char2Character` => _,`charArrayOps` => _,`charWrapper` => _,`classManifest` => _,`classOf` => _,`conforms` => _,`double2Double` => _,`doubleArrayOps` |
### Keybase proof | |
I hereby claim: | |
* I am tkawachi on github. | |
* I am kawachi (https://keybase.io/kawachi) on keybase. | |
* I have a public key whose fingerprint is 30A4 C610 D902 FE81 753C ED13 DDB2 7CB9 8A10 4BAA | |
To claim this, I am signing this object: |
Haskellの特徴として pure ということが挙げられる。 pure というのは副作用がないってこと。 画面に何か出力したり、ファイルから読み込んだり、ネットワーク通信したり、というのは副作用に分類される。 しかし実際のところは Haskell で書いたプログラムでファイルを読み込んだりできる。 pure なのに。どういうこと?
みんなだいすき JavaScript を例にして簡単に説明してみる。
対象コードはコレ。
scala> :paste | |
// Entering paste mode (ctrl-D to finish) | |
case class A(a: Int, b:Int) | |
A.tupled | |
// Exiting paste mode, now interpreting. | |
defined class A | |
res17: ((Int, Int)) => A = <function1> |
Denying load of chrome-extension://gcncenlmfhkngpkgafognfofpanojolb/callback.html?code=略. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension. |
val charset = "UTF-8" | |
val md = java.security.MessageDigest.getInstance("SHA-1") | |
md.digest("Hoge".getBytes(charset)).map(_ & 0xFF).map("%02x".format(_)).mkString |
import org.json4s.native._ | |
import org.json4s.native.JsonMethods._ | |
import scala.collection.mutable | |
object App { | |
implicit val format = org.json4s.DefaultFormats | |
def main(args: Array[String]) = { | |
val a1 = Map("a" -> 1, "b" -> 3) | |
val a2 = mutable.Map("a" -> 1, "b" -> 3) |
private static function __init__() : Void untyped { | |
#if embed_js | |
if( untyped __js__("typeof($) == 'undefined'") ) | |
haxe.macro.Compiler.includeFile("js/jquery-latest.min.js"); | |
#end | |
var q : Dynamic = (untyped js.Browser.window).jQuery; | |
js.JQuery = q; | |
__feature__('js.JQuery.iterator', | |
q.fn.iterator = function() return { pos : 0, j : __this__, hasNext : function() return __this__.pos < __this__.j.length, next : function() return $(__this__.j[__this__.pos++]) } | |
); |
import play.api.db.evolutions.EvolutionsPlugin | |
import play.api.Application | |
import javax.sql.DataSource | |
import scala.util.control.Exception._ | |
import java.sql.{ Statement, Connection, SQLException } | |
/** | |
* Evolution plugin with MySQL lock. | |
* | |
* To enable this plugin, |
! Internal server error, for (GET) [/@flyway/default/migrate/?redirect=http%3A%2F%2Flocalhost%3A9000%2F] -> | |
java.lang.AbstractMethodError: com.github.tototoshi.play2.flyway.Plugin.handleWebCommand(Lplay/api/mvc/RequestHeader;Lplay/core/BuildLink;Ljava/io/File;)Lscala/Option; | |
at play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5$$anonfun$apply$6.apply(ApplicationProvider.scala:178) ~[play_2.10-2.3-M1.jar:2.3-M1] | |
at play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5$$anonfun$apply$6.apply(ApplicationProvider.scala:177) ~[play_2.10-2.3-M1.jar:2.3-M1] | |
at scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:111) ~[scala-library.jar:na] | |
at scala.collection.immutable.List.foldLeft(List.scala:84) ~[scala-library.jar:na] | |
at play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5.apply(ApplicationProvider.scala:177) ~[play_2.10-2.3-M1.jar:2.3-M1] | |
[error] application - Error while rend |