SPECIALIZE编译指示的目的是创建更具体的函数版本.
我有一个功能
adaptBlocks :: Int -> BlocksField a -> Maybe (BlocksField a)
Run Code Online (Sandbox Code Playgroud)
我把它专门化如下:
{-# SPECIALIZE NOINLINE
adaptBlocks :: Int -> BlocksField Element -> Maybe (BlocksField Element) #-}
Run Code Online (Sandbox Code Playgroud)
但编译器给了我这个令人困惑的警告:
SPECIALISE pragma for non-overloaded function ‘adaptBlocks’
Run Code Online (Sandbox Code Playgroud)
怎么了?
我一直试图找到一个3小时的解决方案,没有任何帮助.有这样的雷音项目project.clj:
(defproject funcs "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]
[org.xerial/sqlite-jdbc "3.7.2"]])
Run Code Online (Sandbox Code Playgroud)
同样,还有一个core.clj标题:
(ns funcs.core
(:gen-class)
(:import (java.sql.Connection)
(java.sql.DriverManager)
(java.sql.ResultSet)
(java.sql.SQLException)
(java.sql.Statement))
(:require [clojure.string :as str]
[clojure.java.jdbc :as j])) ; JDBC Driver for SQLite
Run Code Online (Sandbox Code Playgroud)
在lein deps我尝试编译core.clj之后,但得到:
Compiling src/funcs/core.clj
Could not locate funcs/core/clj__init.class or funcs/core/clj.clj on classpath.
Exception in thread "main" java.io.FileNotFoundException: Could not locate funcs/core/clj__init.class or funcs/core/clj.clj on classpath., compiling:(/tmp/form-init8916675856325046616.clj:1:73)
at clojure.lang.Compiler.load(Compiler.java:7391) …Run Code Online (Sandbox Code Playgroud) 我的目标是编写带有一些多态值的函数,并列出表示具体类型的typereps.它返回具有相同值的新列表,但已经转换为通过typereps指定的具体类型.
让我们有值的这种列表:["one", "two"]与-XOverloadedStrings启用.
每个的类型分别是IsString a => a.
我们可以通过这种方式获得的类型的列表:
import Data.Typeable (Proxy(..), typeRep)
import Data.Text (Text)
[typeRep (Proxy :: Proxy String), typeRep (Proxy :: Proxy ByteString)]
Run Code Online (Sandbox Code Playgroud)
有没有办法获得"one"类型String和"two"类型ByteString?
PS为了防止根据包含不同类型值的列表的错误,我们可以包装每个值Dynamic.,如下例所示(伪代码):
{-# LANGUAGE ParallelListComp #-}
import Data.Dynamic (toDyn)
[ toDyn (val :: type') | val <- vals | type' <- concreteTypes ]
Run Code Online (Sandbox Code Playgroud)
它可以使用Template Haskell完成,但它太难看了.