我希望使用Shift-Enter和在vim中以普通模式插入换行符Ctrl-Enter.我试图从一些解决方案和混合解决方案,Vim的维基-插入新行而不进入插入模式,但Shift-Enter并Ctrl-Enter没有作出回应:
" put a new line before or after to this line
nnoremap <S-CR> m`o<Esc>``
nnoremap <C-CR> m`O<Esc>``
" reverse J command
nnoremap <C-J> vaW<Esc>Bi<CR><Esc>k:s/\s\+$//<CR>$
Run Code Online (Sandbox Code Playgroud) import Data.Char
main = do
c <- getChar
if not $ isUpper c
then do putChar $ toUpper c
main
else putChar '\n'
Run Code Online (Sandbox Code Playgroud)
在GHCi中加载和执行:
?> :l foo.hs
Ok, modules loaded: Main.
?> main
ñÑsSjJ44aAtTR
?>
Run Code Online (Sandbox Code Playgroud)
这会消耗一个字符.
但在终端:
[~ %]> runhaskell foo.hs
utar,hkñm-Rjaer
UTAR,HKÑM-
[~ %]>
Run Code Online (Sandbox Code Playgroud)
它一次消耗一行.
为什么它的表现不同?
我正在尝试(不成功)在运行时在haskell中创建一个"对象"*,其类型在运行时使用依赖类型定义.
我正在关注依赖类型的本教程,它们用于在运行时传递值的函数是一个函数,它接受Sing一个参数并使用模式匹配值Sing来获取运行时的数字.但是我无法访问任何Sing模式匹配.
我认为下面的代码可以工作,但我得到的实际上是非常令人失望的,编译器告诉我,n从类型定义来看randomNetwork,与n我在类型定义中捕获的不一样SNat.
{-# LANGUAGE
ScopedTypeVariables, TemplateHaskell, TypeFamilies, GADTs, KindSignatures,
TypeOperators, FlexibleContexts, RankNTypes, UndecidableInstances,
FlexibleInstances, InstanceSigs, DefaultSignatures, DataKinds,
RecordWildCards, StandaloneDeriving, MultiParamTypeClasses #-}
module Main where
-- some imports to make the code below main work
import Control.Monad.Random
import GHC.TypeLits
import Data.List
--import Grenade
import Data.Singletons
import Data.Singletons.TypeLits
main = do
let sizeHidden = toSing (20 :: Integer) :: SomeSing Nat
net0 <- case sizeHidden …Run Code Online (Sandbox Code Playgroud) 我发现有两种方法可以在运行时使用TypeLits和Proxy(Data.Proxy和GHC.TypeLits)或Singletons(Data.Singletons)在运行时将Integer提升为Nat(或KnownNat,我还没有得到区别). ).在下面的代码中,您可以看到如何使用这两种方法中的每一种:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Main where
import Prelude hiding (replicate)
import Data.Proxy (Proxy(Proxy))
import Data.Monoid ((<>))
import Data.Singletons (SomeSing(..), toSing)
import GHC.TypeLits
import Data.Singletons.TypeLits
import Data.Vector.Sized (Vector, replicate)
main :: IO ()
main = playingWithTypes 8
playingWithTypes :: Integer -> IO ()
playingWithTypes nn = do
case someNatVal nn of
Just (SomeNat (proxy :: Proxy n)) -> do
-- let (num :: Integer) = natVal proxy
-- putStrLn $ …Run Code Online (Sandbox Code Playgroud) 我尝试在Haskell中打印函数只是为了好玩,就像这个例子:
{-# LANGUAGE FlexibleInstances #-}
instance Show (Int -> Bool) where
show _ = "function: Int -> Bool"
Run Code Online (Sandbox Code Playgroud)
在GHCi中加载并运行和示例:
?> :l foo
[1 of 1] Compiling Main ( foo.hs, interpreted )
foo.hs:2:1: Warning: Unrecognised pragma
Ok, modules loaded: Main.
?> (==2) :: Int -> Bool
function: Int -> Bool
Run Code Online (Sandbox Code Playgroud)
但是,我希望看到每个函数都在调用时自行打印.
我已经找到了将a Nat转换为Integer使用的方法Proxy,natVal您可以在下面的代码中看到:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Data.Proxy (Proxy)
import Data.Monoid ((<>))
import GHC.TypeLits
main :: IO ()
main = do
fromNat (undefined :: Proxy 5)
fromNat :: KnownNat n => Proxy n -> IO ()
fromNat proxy = do
let (num :: Integer) = natVal proxy -- converting a Nat to an Integer
putStrLn $ "Some num: " <> show num
Run Code Online (Sandbox Code Playgroud)
但是我无法想出将类型列表转换为常规列表的简单方法,下面的代码甚至不会键入check:
{-# LANGUAGE DataKinds …Run Code Online (Sandbox Code Playgroud)